From 1915179ad93fe905c3551e6975ec31d5042f938b Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:22:38 +0200 Subject: [PATCH] implement PeerSet type with peer local & remote conflict resolving --- .../mykola2312/retracker/tracker/PeerSet.java | 45 +++++++++++++++++++ .../retracker/tracker/PeerSetTest.java | 43 ++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/main/java/com/mykola2312/retracker/tracker/PeerSet.java create mode 100644 src/test/java/com/mykola2312/retracker/tracker/PeerSetTest.java diff --git a/src/main/java/com/mykola2312/retracker/tracker/PeerSet.java b/src/main/java/com/mykola2312/retracker/tracker/PeerSet.java new file mode 100644 index 0000000..baa59c5 --- /dev/null +++ b/src/main/java/com/mykola2312/retracker/tracker/PeerSet.java @@ -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 implements Iterable { + 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 iterator() { + return values().iterator(); + } +} diff --git a/src/test/java/com/mykola2312/retracker/tracker/PeerSetTest.java b/src/test/java/com/mykola2312/retracker/tracker/PeerSetTest.java new file mode 100644 index 0000000..517dcfb --- /dev/null +++ b/src/test/java/com/mykola2312/retracker/tracker/PeerSetTest.java @@ -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 it = set.iterator(); + + assertEquals(true, it.hasNext()); + assertEquals(1337, it.next().getAddress().getPort()); + + assertEquals(true, it.hasNext()); + assertEquals(1338, it.next().getAddress().getPort()); + } +}