Skip to content

Commit 3dd693d

Browse files
committed
dev: complete torrent entry tests
1 parent f11f70f commit 3dd693d

15 files changed

+510
-234
lines changed

cSpell.json

+1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
"ostr",
9595
"Pando",
9696
"peekable",
97+
"peerlist",
9798
"proot",
9899
"proto",
99100
"Quickstart",

packages/configuration/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ use torrust_tracker_primitives::{DatabaseDriver, TrackerMode};
246246
/// The maximum number of returned peers for a torrent.
247247
pub const TORRENT_PEERS_LIMIT: usize = 74;
248248

249-
#[derive(Copy, Clone, Debug, PartialEq, Default, Constructor)]
249+
#[derive(Copy, Clone, Debug, PartialEq, Constructor)]
250250
pub struct TrackerPolicy {
251251
pub remove_peerless_torrents: bool,
252252
pub max_peer_timeout: u32,

packages/torrent-repository/src/entry/mod.rs

+9-11
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub trait Entry {
1717
fn get_stats(&self) -> SwarmMetadata;
1818

1919
/// Returns True if Still a Valid Entry according to the Tracker Policy
20-
fn is_not_zombie(&self, policy: &TrackerPolicy) -> bool;
20+
fn is_good(&self, policy: &TrackerPolicy) -> bool;
2121

2222
/// Returns True if the Peers is Empty
2323
fn peers_is_empty(&self) -> bool;
@@ -51,7 +51,7 @@ pub trait Entry {
5151
#[allow(clippy::module_name_repetitions)]
5252
pub trait EntrySync {
5353
fn get_stats(&self) -> SwarmMetadata;
54-
fn is_not_zombie(&self, policy: &TrackerPolicy) -> bool;
54+
fn is_good(&self, policy: &TrackerPolicy) -> bool;
5555
fn peers_is_empty(&self) -> bool;
5656
fn get_peers_len(&self) -> usize;
5757
fn get_peers(&self, limit: Option<usize>) -> Vec<Arc<peer::Peer>>;
@@ -63,15 +63,13 @@ pub trait EntrySync {
6363

6464
#[allow(clippy::module_name_repetitions)]
6565
pub trait EntryAsync {
66-
fn get_stats(self) -> impl std::future::Future<Output = SwarmMetadata> + Send;
67-
68-
#[allow(clippy::wrong_self_convention)]
69-
fn is_not_zombie(self, policy: &TrackerPolicy) -> impl std::future::Future<Output = bool> + Send;
70-
fn peers_is_empty(self) -> impl std::future::Future<Output = bool> + Send;
71-
fn get_peers_len(self) -> impl std::future::Future<Output = usize> + Send;
72-
fn get_peers(self, limit: Option<usize>) -> impl std::future::Future<Output = Vec<Arc<peer::Peer>>> + Send;
66+
fn get_stats(&self) -> impl std::future::Future<Output = SwarmMetadata> + Send;
67+
fn is_good(&self, policy: &TrackerPolicy) -> impl std::future::Future<Output = bool> + Send;
68+
fn peers_is_empty(&self) -> impl std::future::Future<Output = bool> + Send;
69+
fn get_peers_len(&self) -> impl std::future::Future<Output = usize> + Send;
70+
fn get_peers(&self, limit: Option<usize>) -> impl std::future::Future<Output = Vec<Arc<peer::Peer>>> + Send;
7371
fn get_peers_for_peer(
74-
self,
72+
&self,
7573
client: &peer::Peer,
7674
limit: Option<usize>,
7775
) -> impl std::future::Future<Output = Vec<Arc<peer::Peer>>> + Send;
@@ -94,5 +92,5 @@ pub struct Torrent {
9492
// #[serde(skip)]
9593
pub(crate) peers: std::collections::BTreeMap<peer::Id, Arc<peer::Peer>>,
9694
/// The number of peers that have ever completed downloading the torrent associated to this entry
97-
pub(crate) completed: u32,
95+
pub(crate) downloaded: u32,
9896
}

packages/torrent-repository/src/entry/mutex_std.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ impl EntrySync for EntryMutexStd {
1212
self.lock().expect("it should get a lock").get_stats()
1313
}
1414

15-
fn is_not_zombie(&self, policy: &TrackerPolicy) -> bool {
16-
self.lock().expect("it should get a lock").is_not_zombie(policy)
15+
fn is_good(&self, policy: &TrackerPolicy) -> bool {
16+
self.lock().expect("it should get a lock").is_good(policy)
1717
}
1818

1919
fn peers_is_empty(&self) -> bool {

packages/torrent-repository/src/entry/mutex_tokio.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,27 @@ use super::{Entry, EntryAsync};
88
use crate::EntryMutexTokio;
99

1010
impl EntryAsync for EntryMutexTokio {
11-
async fn get_stats(self) -> SwarmMetadata {
11+
async fn get_stats(&self) -> SwarmMetadata {
1212
self.lock().await.get_stats()
1313
}
1414

15-
async fn is_not_zombie(self, policy: &TrackerPolicy) -> bool {
16-
self.lock().await.is_not_zombie(policy)
15+
async fn is_good(&self, policy: &TrackerPolicy) -> bool {
16+
self.lock().await.is_good(policy)
1717
}
1818

19-
async fn peers_is_empty(self) -> bool {
19+
async fn peers_is_empty(&self) -> bool {
2020
self.lock().await.peers_is_empty()
2121
}
2222

23-
async fn get_peers_len(self) -> usize {
23+
async fn get_peers_len(&self) -> usize {
2424
self.lock().await.get_peers_len()
2525
}
2626

27-
async fn get_peers(self, limit: Option<usize>) -> Vec<Arc<peer::Peer>> {
27+
async fn get_peers(&self, limit: Option<usize>) -> Vec<Arc<peer::Peer>> {
2828
self.lock().await.get_peers(limit)
2929
}
3030

31-
async fn get_peers_for_peer(self, client: &peer::Peer, limit: Option<usize>) -> Vec<Arc<peer::Peer>> {
31+
async fn get_peers_for_peer(&self, client: &peer::Peer, limit: Option<usize>) -> Vec<Arc<peer::Peer>> {
3232
self.lock().await.get_peers_for_peer(client, limit)
3333
}
3434

packages/torrent-repository/src/entry/single.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ impl Entry for EntrySingle {
1616
let incomplete: u32 = self.peers.len() as u32 - complete;
1717

1818
SwarmMetadata {
19-
downloaded: self.completed,
19+
downloaded: self.downloaded,
2020
complete,
2121
incomplete,
2222
}
2323
}
2424

25-
fn is_not_zombie(&self, policy: &TrackerPolicy) -> bool {
26-
if policy.persistent_torrent_completed_stat && self.completed > 0 {
25+
fn is_good(&self, policy: &TrackerPolicy) -> bool {
26+
if policy.persistent_torrent_completed_stat && self.downloaded > 0 {
2727
return true;
2828
}
2929

@@ -70,26 +70,26 @@ impl Entry for EntrySingle {
7070
}
7171

7272
fn insert_or_update_peer(&mut self, peer: &peer::Peer) -> bool {
73-
let mut did_torrent_stats_change: bool = false;
73+
let mut downloaded_stats_updated: bool = false;
7474

7575
match peer::ReadInfo::get_event(peer) {
7676
AnnounceEvent::Stopped => {
7777
drop(self.peers.remove(&peer::ReadInfo::get_id(peer)));
7878
}
7979
AnnounceEvent::Completed => {
80-
let peer_old = self.peers.insert(peer::ReadInfo::get_id(peer), Arc::new(*peer));
80+
let previous = self.peers.insert(peer::ReadInfo::get_id(peer), Arc::new(*peer));
8181
// Don't count if peer was not previously known and not already completed.
82-
if peer_old.is_some_and(|p| p.event != AnnounceEvent::Completed) {
83-
self.completed += 1;
84-
did_torrent_stats_change = true;
82+
if previous.is_some_and(|p| p.event != AnnounceEvent::Completed) {
83+
self.downloaded += 1;
84+
downloaded_stats_updated = true;
8585
}
8686
}
8787
_ => {
8888
drop(self.peers.insert(peer::ReadInfo::get_id(peer), Arc::new(*peer)));
8989
}
9090
}
9191

92-
did_torrent_stats_change
92+
downloaded_stats_updated
9393
}
9494

9595
fn insert_or_update_peer_and_get_stats(&mut self, peer: &peer::Peer) -> (bool, SwarmMetadata) {

packages/torrent-repository/src/repository/rw_lock_std.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ where
8383

8484
let entry = EntrySingle {
8585
peers: BTreeMap::default(),
86-
completed: *completed,
86+
downloaded: *completed,
8787
};
8888

8989
torrents.insert(*info_hash, entry);
@@ -107,6 +107,6 @@ where
107107
fn remove_peerless_torrents(&self, policy: &TrackerPolicy) {
108108
let mut db = self.get_torrents_mut();
109109

110-
db.retain(|_, e| e.is_not_zombie(policy));
110+
db.retain(|_, e| e.is_good(policy));
111111
}
112112
}

packages/torrent-repository/src/repository/rw_lock_std_mutex_std.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ where
9292
let entry = EntryMutexStd::new(
9393
EntrySingle {
9494
peers: BTreeMap::default(),
95-
completed: *completed,
95+
downloaded: *completed,
9696
}
9797
.into(),
9898
);
@@ -118,6 +118,6 @@ where
118118
fn remove_peerless_torrents(&self, policy: &TrackerPolicy) {
119119
let mut db = self.get_torrents_mut();
120120

121-
db.retain(|_, e| e.lock().expect("it should lock entry").is_not_zombie(policy));
121+
db.retain(|_, e| e.lock().expect("it should lock entry").is_good(policy));
122122
}
123123
}

packages/torrent-repository/src/repository/rw_lock_std_mutex_tokio.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ where
9696
let entry = EntryMutexTokio::new(
9797
EntrySingle {
9898
peers: BTreeMap::default(),
99-
completed: *completed,
99+
downloaded: *completed,
100100
}
101101
.into(),
102102
);
@@ -126,6 +126,6 @@ where
126126
async fn remove_peerless_torrents(&self, policy: &TrackerPolicy) {
127127
let mut db = self.get_torrents_mut();
128128

129-
db.retain(|_, e| e.blocking_lock().is_not_zombie(policy));
129+
db.retain(|_, e| e.blocking_lock().is_good(policy));
130130
}
131131
}

packages/torrent-repository/src/repository/rw_lock_tokio.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ where
8484

8585
let entry = EntrySingle {
8686
peers: BTreeMap::default(),
87-
completed: *completed,
87+
downloaded: *completed,
8888
};
8989

9090
torrents.insert(*info_hash, entry);
@@ -108,6 +108,6 @@ where
108108
async fn remove_peerless_torrents(&self, policy: &TrackerPolicy) {
109109
let mut db = self.get_torrents_mut().await;
110110

111-
db.retain(|_, e| e.is_not_zombie(policy));
111+
db.retain(|_, e| e.is_good(policy));
112112
}
113113
}

packages/torrent-repository/src/repository/rw_lock_tokio_mutex_std.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ where
9393
let entry = EntryMutexStd::new(
9494
EntrySingle {
9595
peers: BTreeMap::default(),
96-
completed: *completed,
96+
downloaded: *completed,
9797
}
9898
.into(),
9999
);
@@ -119,6 +119,6 @@ where
119119
async fn remove_peerless_torrents(&self, policy: &TrackerPolicy) {
120120
let mut db = self.get_torrents_mut().await;
121121

122-
db.retain(|_, e| e.lock().expect("it should lock entry").is_not_zombie(policy));
122+
db.retain(|_, e| e.lock().expect("it should lock entry").is_good(policy));
123123
}
124124
}

packages/torrent-repository/src/repository/rw_lock_tokio_mutex_tokio.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ where
7070
async fn get_metrics(&self) -> TorrentsMetrics {
7171
let mut metrics = TorrentsMetrics::default();
7272

73-
for entry in self.get_torrents().await.values().cloned() {
73+
for entry in self.get_torrents().await.values() {
7474
let stats = entry.get_stats().await;
7575
metrics.seeders += u64::from(stats.complete);
7676
metrics.completed += u64::from(stats.downloaded);
@@ -93,7 +93,7 @@ where
9393
let entry = EntryMutexTokio::new(
9494
EntrySingle {
9595
peers: BTreeMap::default(),
96-
completed: *completed,
96+
downloaded: *completed,
9797
}
9898
.into(),
9999
);
@@ -119,6 +119,6 @@ where
119119
async fn remove_peerless_torrents(&self, policy: &TrackerPolicy) {
120120
let mut db = self.get_torrents_mut().await;
121121

122-
db.retain(|_, e| e.blocking_lock().is_not_zombie(policy));
122+
db.retain(|_, e| e.blocking_lock().is_good(policy));
123123
}
124124
}

packages/torrent-repository/tests/common/torrent_peer_builder.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ impl TorrentPeerBuilder {
2828
self
2929
}
3030

31+
#[must_use]
32+
pub fn with_event_started(mut self) -> Self {
33+
self.peer.event = AnnounceEvent::Started;
34+
self
35+
}
36+
3137
#[must_use]
3238
pub fn with_peer_address(mut self, peer_addr: SocketAddr) -> Self {
3339
self.peer.peer_addr = peer_addr;
@@ -61,7 +67,7 @@ impl TorrentPeerBuilder {
6167
/// A torrent seeder is a peer with 0 bytes left to download which
6268
/// has not announced it has stopped
6369
#[must_use]
64-
pub fn a_torrent_seeder() -> peer::Peer {
70+
pub fn a_completed_peer() -> peer::Peer {
6571
TorrentPeerBuilder::new()
6672
.with_number_of_bytes_left(0)
6773
.with_event_completed()
@@ -71,9 +77,9 @@ pub fn a_torrent_seeder() -> peer::Peer {
7177
/// A torrent leecher is a peer that is not a seeder.
7278
/// Leecher: left > 0 OR event = Stopped
7379
#[must_use]
74-
pub fn a_torrent_leecher() -> peer::Peer {
80+
pub fn a_started_peer() -> peer::Peer {
7581
TorrentPeerBuilder::new()
7682
.with_number_of_bytes_left(1)
77-
.with_event_completed()
83+
.with_event_started()
7884
.into()
7985
}

0 commit comments

Comments
 (0)