implement PeerSet type with peer local & remote conflict resolving

This commit is contained in:
mykola2312 2024-10-27 14:22:38 +02:00
parent 59ff54edf6
commit 1915179ad9
2 changed files with 88 additions and 0 deletions

View file

@ -0,0 +1,45 @@
package com.mykola2312.retracker.tracker;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Iterator;
public class PeerSet extends HashMap<InetSocketAddress, Peer> implements Iterable<Peer> {
private static final long serialVersionUID = -6175727375850698818L;
public PeerSet() {
super();
}
public PeerSet(int initialCapacity) {
super(initialCapacity);
}
/* Peer add contract: will override existing peer
* only in favor of new locally announced peer,
* in other words PeerType.LOCAL will always overwrite PeerType.REMOTE
*/
public void put(Peer peer) {
InetSocketAddress key = peer.getAddress();
// check for existing peer
Peer found = get(key);
if (found != null && found.getType() == PeerType.REMOTE) {
remove(key);
}
put(key, peer);
}
public Peer get(InetSocketAddress addr) {
return super.get(addr);
}
public Peer get(Peer peer) {
return get(peer.getAddress());
}
@Override
public Iterator<Peer> iterator() {
return values().iterator();
}
}

View file

@ -0,0 +1,43 @@
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.Iterator;
import org.junit.jupiter.api.Test;
public class PeerSetTest {
private static InetSocketAddress newAddress(String addr, int port) throws UnknownHostException {
return new InetSocketAddress(InetAddress.getByName(addr), port);
}
@Test
public void testPeerAddContract() throws UnknownHostException {
PeerSet set = new PeerSet(1);
set.put(new Peer(newAddress("127.0.0.1", 1337))); // remote
assertEquals(PeerType.REMOTE, set.get(newAddress("127.0.0.1", 1337)).getType());
// override with local peer
set.put(new Peer(newAddress("127.0.0.1", 1337), null)); // local
assertEquals(PeerType.LOCAL, set.get(newAddress("127.0.0.1", 1337)).getType());
}
@Test
public void testIterator() throws UnknownHostException {
PeerSet set = new PeerSet(2);
set.put(new Peer(newAddress("127.0.0.1", 1337)));
set.put(new Peer(newAddress("127.0.0.1", 1338)));
Iterator<Peer> it = set.iterator();
assertEquals(true, it.hasNext());
assertEquals(1337, it.next().getAddress().getPort());
assertEquals(true, it.hasNext());
assertEquals(1338, it.next().getAddress().getPort());
}
}