@@ -38,6 +38,9 @@ pub struct Tracker {
38
38
39
39
#[ derive( Debug , PartialEq , Default ) ]
40
40
pub struct TorrentsMetrics {
41
+ // code-review: consider using `SwamStats` for
42
+ // `seeders`, `completed`, and `leechers` attributes.
43
+ // pub swam_stats: SwamStats;
41
44
pub seeders : u64 ,
42
45
pub completed : u64 ,
43
46
pub leechers : u64 ,
@@ -223,7 +226,7 @@ impl Tracker {
223
226
/// # Errors
224
227
///
225
228
/// Will return a `database::Error` if unable to `load_keys` from the database.
226
- pub async fn load_keys ( & self ) -> Result < ( ) , databases:: error:: Error > {
229
+ pub async fn load_keys_from_database ( & self ) -> Result < ( ) , databases:: error:: Error > {
227
230
let keys_from_database = self . database . load_keys ( ) . await ?;
228
231
let mut keys = self . keys . write ( ) . await ;
229
232
@@ -301,7 +304,7 @@ impl Tracker {
301
304
/// # Errors
302
305
///
303
306
/// Will return a `database::Error` if unable to load the list whitelisted `info_hash`s from the database.
304
- pub async fn load_whitelist ( & self ) -> Result < ( ) , databases:: error:: Error > {
307
+ pub async fn load_whitelist_from_database ( & self ) -> Result < ( ) , databases:: error:: Error > {
305
308
let whitelisted_torrents_from_database = self . database . load_whitelist ( ) . await ?;
306
309
let mut whitelist = self . whitelist . write ( ) . await ;
307
310
@@ -402,7 +405,7 @@ impl Tracker {
402
405
/// # Errors
403
406
///
404
407
/// Will return a `database::Error` if unable to load the list of `persistent_torrents` from the database.
405
- pub async fn load_persistent_torrents ( & self ) -> Result < ( ) , databases:: error:: Error > {
408
+ pub async fn load_torrents_from_database ( & self ) -> Result < ( ) , databases:: error:: Error > {
406
409
let persistent_torrents = self . database . load_persistent_torrents ( ) . await ?;
407
410
408
411
let mut torrents = self . torrents . write ( ) . await ;
@@ -700,6 +703,55 @@ mod tests {
700
703
) ;
701
704
}
702
705
706
+ #[ tokio:: test]
707
+ async fn it_should_return_all_the_peers_for_a_given_torrent ( ) {
708
+ let tracker = public_tracker ( ) ;
709
+
710
+ let info_hash = sample_info_hash ( ) ;
711
+ let peer = sample_peer ( ) ;
712
+
713
+ tracker. update_torrent_with_peer_and_get_stats ( & info_hash, & peer) . await ;
714
+
715
+ let peers = tracker. get_all_torrent_peers ( & info_hash) . await ;
716
+
717
+ assert_eq ! ( peers, vec![ peer] ) ;
718
+ }
719
+
720
+ #[ tokio:: test]
721
+ async fn it_should_return_all_the_peers_for_a_given_torrent_excluding_a_given_peer ( ) {
722
+ let tracker = public_tracker ( ) ;
723
+
724
+ let info_hash = sample_info_hash ( ) ;
725
+ let peer = sample_peer ( ) ;
726
+
727
+ tracker. update_torrent_with_peer_and_get_stats ( & info_hash, & peer) . await ;
728
+
729
+ let peers = tracker. get_peers_for_peer ( & info_hash, & peer) . await ;
730
+
731
+ assert_eq ! ( peers, vec![ ] ) ;
732
+ }
733
+
734
+ #[ tokio:: test]
735
+ async fn it_should_return_the_torrent_metrics ( ) {
736
+ let tracker = public_tracker ( ) ;
737
+
738
+ tracker
739
+ . update_torrent_with_peer_and_get_stats ( & sample_info_hash ( ) , & leecher ( ) )
740
+ . await ;
741
+
742
+ let torrent_metrics = tracker. get_torrents_metrics ( ) . await ;
743
+
744
+ assert_eq ! (
745
+ torrent_metrics,
746
+ TorrentsMetrics {
747
+ seeders: 0 ,
748
+ completed: 0 ,
749
+ leechers: 1 ,
750
+ torrents: 1 ,
751
+ }
752
+ ) ;
753
+ }
754
+
703
755
mod for_all_config_modes {
704
756
705
757
mod handling_an_announce_request {
@@ -984,6 +1036,55 @@ mod tests {
984
1036
}
985
1037
}
986
1038
1039
+ mod handling_the_torrent_whitelist {
1040
+ use crate :: tracker:: tests:: the_tracker:: { sample_info_hash, whitelisted_tracker} ;
1041
+
1042
+ #[ tokio:: test]
1043
+ async fn it_should_add_a_torrent_to_the_whitelist ( ) {
1044
+ let tracker = whitelisted_tracker ( ) ;
1045
+
1046
+ let info_hash = sample_info_hash ( ) ;
1047
+
1048
+ tracker. add_torrent_to_whitelist ( & info_hash) . await . unwrap ( ) ;
1049
+
1050
+ assert ! ( tracker. is_info_hash_whitelisted( & info_hash) . await ) ;
1051
+ }
1052
+
1053
+ #[ tokio:: test]
1054
+ async fn it_should_remove_a_torrent_from_the_whitelist ( ) {
1055
+ let tracker = whitelisted_tracker ( ) ;
1056
+
1057
+ let info_hash = sample_info_hash ( ) ;
1058
+
1059
+ tracker. add_torrent_to_whitelist ( & info_hash) . await . unwrap ( ) ;
1060
+
1061
+ tracker. remove_torrent_from_whitelist ( & info_hash) . await . unwrap ( ) ;
1062
+
1063
+ assert ! ( !tracker. is_info_hash_whitelisted( & info_hash) . await ) ;
1064
+ }
1065
+
1066
+ mod persistence {
1067
+ use crate :: tracker:: tests:: the_tracker:: { sample_info_hash, whitelisted_tracker} ;
1068
+
1069
+ #[ tokio:: test]
1070
+ async fn it_should_load_the_whitelist_from_the_database ( ) {
1071
+ let tracker = whitelisted_tracker ( ) ;
1072
+
1073
+ let info_hash = sample_info_hash ( ) ;
1074
+
1075
+ tracker. add_torrent_to_whitelist ( & info_hash) . await . unwrap ( ) ;
1076
+
1077
+ // Remove torrent from the in-memory whitelist
1078
+ tracker. whitelist . write ( ) . await . remove ( & info_hash) ;
1079
+ assert ! ( !tracker. is_info_hash_whitelisted( & info_hash) . await ) ;
1080
+
1081
+ tracker. load_whitelist_from_database ( ) . await . unwrap ( ) ;
1082
+
1083
+ assert ! ( tracker. is_info_hash_whitelisted( & info_hash) . await ) ;
1084
+ }
1085
+ }
1086
+ }
1087
+
987
1088
mod handling_an_announce_request { }
988
1089
989
1090
mod handling_an_scrape_request {
@@ -1112,7 +1213,7 @@ mod tests {
1112
1213
// Remove the newly generated key in memory
1113
1214
tracker. keys . write ( ) . await . remove ( & key. id ( ) ) ;
1114
1215
1115
- let result = tracker. load_keys ( ) . await ;
1216
+ let result = tracker. load_keys_from_database ( ) . await ;
1116
1217
1117
1218
assert ! ( result. is_ok( ) ) ;
1118
1219
assert ! ( tracker. verify_auth_key( & key. id( ) ) . await . is_ok( ) ) ;
@@ -1152,13 +1253,10 @@ mod tests {
1152
1253
let swarm_stats = tracker. update_torrent_with_peer_and_get_stats ( & info_hash, & peer) . await ;
1153
1254
assert_eq ! ( swarm_stats. completed, 1 ) ;
1154
1255
1155
- let torrents = tracker. get_all_torrent_peers ( & info_hash) . await ;
1156
- assert_eq ! ( torrents. len( ) , 1 ) ;
1157
-
1158
1256
// Remove the newly updated torrent from memory
1159
1257
tracker. torrents . write ( ) . await . remove ( & info_hash) ;
1160
1258
1161
- tracker. load_persistent_torrents ( ) . await . unwrap ( ) ;
1259
+ tracker. load_torrents_from_database ( ) . await . unwrap ( ) ;
1162
1260
1163
1261
let torrents = tracker. get_torrents ( ) . await ;
1164
1262
assert ! ( torrents. contains_key( & info_hash) ) ;
0 commit comments