|
1 | 1 | //! A peer list. |
| 2 | +use std::collections::BTreeMap; |
2 | 3 | use std::net::SocketAddr; |
3 | 4 | use std::sync::Arc; |
4 | 5 |
|
5 | 6 | use aquatic_udp_protocol::PeerId; |
6 | | -use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch}; |
| 7 | +use torrust_tracker_primitives::peer::{self, Peer}; |
| 8 | +use torrust_tracker_primitives::DurationSinceUnixEpoch; |
7 | 9 |
|
8 | 10 | // code-review: the current implementation uses the peer Id as the ``BTreeMap`` |
9 | 11 | // key. That would allow adding two identical peers except for the Id. |
10 | 12 | // For example, two peers with the same socket address but a different peer Id |
11 | 13 | // would be allowed. That would lead to duplicated peers in the tracker responses. |
12 | 14 |
|
13 | 15 | #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
14 | | -pub struct PeerList { |
15 | | - peers: std::collections::BTreeMap<PeerId, Arc<peer::Peer>>, |
| 16 | +pub struct Swarm { |
| 17 | + peers: BTreeMap<PeerId, Arc<Peer>>, |
16 | 18 | } |
17 | 19 |
|
18 | | -impl PeerList { |
| 20 | +impl Swarm { |
19 | 21 | #[must_use] |
20 | 22 | pub fn len(&self) -> usize { |
21 | 23 | self.peers.len() |
@@ -94,193 +96,193 @@ mod tests { |
94 | 96 | use torrust_tracker_primitives::peer::fixture::PeerBuilder; |
95 | 97 | use torrust_tracker_primitives::DurationSinceUnixEpoch; |
96 | 98 |
|
97 | | - use crate::entry::peer_list::PeerList; |
| 99 | + use crate::entry::swarm::Swarm; |
98 | 100 |
|
99 | 101 | #[test] |
100 | 102 | fn be_empty_when_no_peers_have_been_inserted() { |
101 | | - let peer_list = PeerList::default(); |
| 103 | + let swarm = Swarm::default(); |
102 | 104 |
|
103 | | - assert!(peer_list.is_empty()); |
| 105 | + assert!(swarm.is_empty()); |
104 | 106 | } |
105 | 107 |
|
106 | 108 | #[test] |
107 | 109 | fn have_zero_length_when_no_peers_have_been_inserted() { |
108 | | - let peer_list = PeerList::default(); |
| 110 | + let swarm = Swarm::default(); |
109 | 111 |
|
110 | | - assert_eq!(peer_list.len(), 0); |
| 112 | + assert_eq!(swarm.len(), 0); |
111 | 113 | } |
112 | 114 |
|
113 | 115 | #[test] |
114 | 116 | fn allow_inserting_a_new_peer() { |
115 | | - let mut peer_list = PeerList::default(); |
| 117 | + let mut swarm = Swarm::default(); |
116 | 118 |
|
117 | 119 | let peer = PeerBuilder::default().build(); |
118 | 120 |
|
119 | | - assert_eq!(peer_list.upsert(peer.into()), None); |
| 121 | + assert_eq!(swarm.upsert(peer.into()), None); |
120 | 122 | } |
121 | 123 |
|
122 | 124 | #[test] |
123 | 125 | fn allow_updating_a_preexisting_peer() { |
124 | | - let mut peer_list = PeerList::default(); |
| 126 | + let mut swarm = Swarm::default(); |
125 | 127 |
|
126 | 128 | let peer = PeerBuilder::default().build(); |
127 | 129 |
|
128 | | - peer_list.upsert(peer.into()); |
| 130 | + swarm.upsert(peer.into()); |
129 | 131 |
|
130 | | - assert_eq!(peer_list.upsert(peer.into()), Some(Arc::new(peer))); |
| 132 | + assert_eq!(swarm.upsert(peer.into()), Some(Arc::new(peer))); |
131 | 133 | } |
132 | 134 |
|
133 | 135 | #[test] |
134 | 136 | fn allow_getting_all_peers() { |
135 | | - let mut peer_list = PeerList::default(); |
| 137 | + let mut swarm = Swarm::default(); |
136 | 138 |
|
137 | 139 | let peer = PeerBuilder::default().build(); |
138 | 140 |
|
139 | | - peer_list.upsert(peer.into()); |
| 141 | + swarm.upsert(peer.into()); |
140 | 142 |
|
141 | | - assert_eq!(peer_list.get_all(None), [Arc::new(peer)]); |
| 143 | + assert_eq!(swarm.get_all(None), [Arc::new(peer)]); |
142 | 144 | } |
143 | 145 |
|
144 | 146 | #[test] |
145 | 147 | fn allow_getting_one_peer_by_id() { |
146 | | - let mut peer_list = PeerList::default(); |
| 148 | + let mut swarm = Swarm::default(); |
147 | 149 |
|
148 | 150 | let peer = PeerBuilder::default().build(); |
149 | 151 |
|
150 | | - peer_list.upsert(peer.into()); |
| 152 | + swarm.upsert(peer.into()); |
151 | 153 |
|
152 | | - assert_eq!(peer_list.get(&peer.peer_id), Some(Arc::new(peer)).as_ref()); |
| 154 | + assert_eq!(swarm.get(&peer.peer_id), Some(Arc::new(peer)).as_ref()); |
153 | 155 | } |
154 | 156 |
|
155 | 157 | #[test] |
156 | 158 | fn increase_the_number_of_peers_after_inserting_a_new_one() { |
157 | | - let mut peer_list = PeerList::default(); |
| 159 | + let mut swarm = Swarm::default(); |
158 | 160 |
|
159 | 161 | let peer = PeerBuilder::default().build(); |
160 | 162 |
|
161 | | - peer_list.upsert(peer.into()); |
| 163 | + swarm.upsert(peer.into()); |
162 | 164 |
|
163 | | - assert_eq!(peer_list.len(), 1); |
| 165 | + assert_eq!(swarm.len(), 1); |
164 | 166 | } |
165 | 167 |
|
166 | 168 | #[test] |
167 | 169 | fn decrease_the_number_of_peers_after_removing_one() { |
168 | | - let mut peer_list = PeerList::default(); |
| 170 | + let mut swarm = Swarm::default(); |
169 | 171 |
|
170 | 172 | let peer = PeerBuilder::default().build(); |
171 | 173 |
|
172 | | - peer_list.upsert(peer.into()); |
| 174 | + swarm.upsert(peer.into()); |
173 | 175 |
|
174 | | - peer_list.remove(&peer.peer_id); |
| 176 | + swarm.remove(&peer.peer_id); |
175 | 177 |
|
176 | | - assert!(peer_list.is_empty()); |
| 178 | + assert!(swarm.is_empty()); |
177 | 179 | } |
178 | 180 |
|
179 | 181 | #[test] |
180 | 182 | fn allow_removing_an_existing_peer() { |
181 | | - let mut peer_list = PeerList::default(); |
| 183 | + let mut swarm = Swarm::default(); |
182 | 184 |
|
183 | 185 | let peer = PeerBuilder::default().build(); |
184 | 186 |
|
185 | | - peer_list.upsert(peer.into()); |
| 187 | + swarm.upsert(peer.into()); |
186 | 188 |
|
187 | | - peer_list.remove(&peer.peer_id); |
| 189 | + swarm.remove(&peer.peer_id); |
188 | 190 |
|
189 | | - assert_eq!(peer_list.get(&peer.peer_id), None); |
| 191 | + assert_eq!(swarm.get(&peer.peer_id), None); |
190 | 192 | } |
191 | 193 |
|
192 | 194 | #[test] |
193 | 195 | fn allow_getting_all_peers_excluding_peers_with_a_given_address() { |
194 | | - let mut peer_list = PeerList::default(); |
| 196 | + let mut swarm = Swarm::default(); |
195 | 197 |
|
196 | 198 | let peer1 = PeerBuilder::default() |
197 | 199 | .with_peer_id(&PeerId(*b"-qB00000000000000001")) |
198 | 200 | .with_peer_addr(&SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 6969)) |
199 | 201 | .build(); |
200 | | - peer_list.upsert(peer1.into()); |
| 202 | + swarm.upsert(peer1.into()); |
201 | 203 |
|
202 | 204 | let peer2 = PeerBuilder::default() |
203 | 205 | .with_peer_id(&PeerId(*b"-qB00000000000000002")) |
204 | 206 | .with_peer_addr(&SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 2)), 6969)) |
205 | 207 | .build(); |
206 | | - peer_list.upsert(peer2.into()); |
| 208 | + swarm.upsert(peer2.into()); |
207 | 209 |
|
208 | | - assert_eq!(peer_list.get_peers_excluding_addr(&peer2.peer_addr, None), [Arc::new(peer1)]); |
| 210 | + assert_eq!(swarm.get_peers_excluding_addr(&peer2.peer_addr, None), [Arc::new(peer1)]); |
209 | 211 | } |
210 | 212 |
|
211 | 213 | #[test] |
212 | 214 | fn return_the_number_of_seeders_in_the_list() { |
213 | | - let mut peer_list = PeerList::default(); |
| 215 | + let mut swarm = Swarm::default(); |
214 | 216 |
|
215 | 217 | let seeder = PeerBuilder::seeder().build(); |
216 | 218 | let leecher = PeerBuilder::leecher().build(); |
217 | 219 |
|
218 | | - peer_list.upsert(seeder.into()); |
219 | | - peer_list.upsert(leecher.into()); |
| 220 | + swarm.upsert(seeder.into()); |
| 221 | + swarm.upsert(leecher.into()); |
220 | 222 |
|
221 | | - let (seeders, _leechers) = peer_list.seeders_and_leechers(); |
| 223 | + let (seeders, _leechers) = swarm.seeders_and_leechers(); |
222 | 224 |
|
223 | 225 | assert_eq!(seeders, 1); |
224 | 226 | } |
225 | 227 |
|
226 | 228 | #[test] |
227 | 229 | fn return_the_number_of_leechers_in_the_list() { |
228 | | - let mut peer_list = PeerList::default(); |
| 230 | + let mut swarm = Swarm::default(); |
229 | 231 |
|
230 | 232 | let seeder = PeerBuilder::seeder().build(); |
231 | 233 | let leecher = PeerBuilder::leecher().build(); |
232 | 234 |
|
233 | | - peer_list.upsert(seeder.into()); |
234 | | - peer_list.upsert(leecher.into()); |
| 235 | + swarm.upsert(seeder.into()); |
| 236 | + swarm.upsert(leecher.into()); |
235 | 237 |
|
236 | | - let (_seeders, leechers) = peer_list.seeders_and_leechers(); |
| 238 | + let (_seeders, leechers) = swarm.seeders_and_leechers(); |
237 | 239 |
|
238 | 240 | assert_eq!(leechers, 1); |
239 | 241 | } |
240 | 242 |
|
241 | 243 | #[test] |
242 | 244 | fn remove_inactive_peers() { |
243 | | - let mut peer_list = PeerList::default(); |
| 245 | + let mut swarm = Swarm::default(); |
244 | 246 | let one_second = DurationSinceUnixEpoch::new(1, 0); |
245 | 247 |
|
246 | 248 | // Insert the peer |
247 | 249 | let last_update_time = DurationSinceUnixEpoch::new(1_669_397_478_934, 0); |
248 | 250 | let peer = PeerBuilder::default().last_updated_on(last_update_time).build(); |
249 | | - peer_list.upsert(peer.into()); |
| 251 | + swarm.upsert(peer.into()); |
250 | 252 |
|
251 | 253 | // Remove peers not updated since one second after inserting the peer |
252 | | - peer_list.remove_inactive_peers(last_update_time + one_second); |
| 254 | + swarm.remove_inactive_peers(last_update_time + one_second); |
253 | 255 |
|
254 | | - assert_eq!(peer_list.len(), 0); |
| 256 | + assert_eq!(swarm.len(), 0); |
255 | 257 | } |
256 | 258 |
|
257 | 259 | #[test] |
258 | 260 | fn not_remove_active_peers() { |
259 | | - let mut peer_list = PeerList::default(); |
| 261 | + let mut swarm = Swarm::default(); |
260 | 262 | let one_second = DurationSinceUnixEpoch::new(1, 0); |
261 | 263 |
|
262 | 264 | // Insert the peer |
263 | 265 | let last_update_time = DurationSinceUnixEpoch::new(1_669_397_478_934, 0); |
264 | 266 | let peer = PeerBuilder::default().last_updated_on(last_update_time).build(); |
265 | | - peer_list.upsert(peer.into()); |
| 267 | + swarm.upsert(peer.into()); |
266 | 268 |
|
267 | 269 | // Remove peers not updated since one second before inserting the peer. |
268 | | - peer_list.remove_inactive_peers(last_update_time - one_second); |
| 270 | + swarm.remove_inactive_peers(last_update_time - one_second); |
269 | 271 |
|
270 | | - assert_eq!(peer_list.len(), 1); |
| 272 | + assert_eq!(swarm.len(), 1); |
271 | 273 | } |
272 | 274 |
|
273 | 275 | #[test] |
274 | 276 | fn allow_inserting_two_identical_peers_except_for_the_id() { |
275 | | - let mut peer_list = PeerList::default(); |
| 277 | + let mut swarm = Swarm::default(); |
276 | 278 |
|
277 | 279 | let peer1 = PeerBuilder::default().with_peer_id(&PeerId(*b"-qB00000000000000001")).build(); |
278 | | - peer_list.upsert(peer1.into()); |
| 280 | + swarm.upsert(peer1.into()); |
279 | 281 |
|
280 | 282 | let peer2 = PeerBuilder::default().with_peer_id(&PeerId(*b"-qB00000000000000002")).build(); |
281 | | - peer_list.upsert(peer2.into()); |
| 283 | + swarm.upsert(peer2.into()); |
282 | 284 |
|
283 | | - assert_eq!(peer_list.len(), 2); |
| 285 | + assert_eq!(swarm.len(), 2); |
284 | 286 | } |
285 | 287 | } |
286 | 288 | } |
0 commit comments