implement Torrent type to hold InfoHash and PeerSet

This commit is contained in:
mykola2312 2024-10-27 14:57:38 +02:00
parent 1915179ad9
commit 534f827afc
2 changed files with 83 additions and 0 deletions

View file

@ -0,0 +1,39 @@
package com.mykola2312.retracker.tracker;
import java.util.Collection;
public class Torrent {
private InfoHash infoHash;
private PeerSet peers;
public Torrent(InfoHash infoHash) {
this.infoHash = infoHash;
this.peers = new PeerSet();
}
// will construct PeerSet with initial single peer
public Torrent(InfoHash infoHash, Peer initiator) {
this.infoHash = infoHash;
this.peers = new PeerSet(1);
peers.put(initiator);
}
public InfoHash getInfoHash() {
return infoHash;
}
/* Copy current set of peers into destination collection.
* Copying over reference is preferable in concurrent environment
*/
public <T extends Collection<Peer>> void copyPeers(T dst) {
for (Peer peer : peers) {
dst.add(peer);
}
}
public <T extends Collection<Peer>> void updatePeers(T src) {
for (Peer peer : src) {
peers.put(peer);
}
}
}

View file

@ -0,0 +1,44 @@
package com.mykola2312.retracker.tracker;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.jupiter.api.Test;
public class TorrentTest {
private static InetSocketAddress newAddress(String addr, int port) throws UnknownHostException {
return new InetSocketAddress(InetAddress.getByName(addr), port);
}
@Test
public void testUpdatePeers() throws Exception {
final InfoHash infoHash = new InfoHash();
infoHash.fromString("360775c6629eb06e60d90201aed1b7bc49a1ce16");
Torrent torrent = new Torrent(infoHash);
{
ArrayList<Peer> copy = new ArrayList<Peer>();
torrent.copyPeers(copy);
assertEquals(0, copy.size());
}
List<Peer> src = Arrays.asList(new Peer(newAddress("127.0.0.1", 1337)),
new Peer(newAddress("127.0.0.1", 1338)));
torrent.updatePeers(src);
{
ArrayList<Peer> copy = new ArrayList<Peer>();
torrent.copyPeers(copy);
assertEquals(2, copy.size());
assertEquals(1337, copy.get(0).getAddress().getPort());
assertEquals(1338, copy.get(1).getAddress().getPort());
}
}
}