From e419ceda7c7722801839cefe93c0e049d1ffb199 Mon Sep 17 00:00:00 2001 From: Michael Peter Christen Date: Sun, 5 Jul 2026 08:38:08 +0200 Subject: IPv6-aware fixes not a full IPv6 support fix, but changes towards --- test/java/net/yacy/peers/SeedDBTest.java | 100 +++++++++++++++++++++++++++++++ test/java/net/yacy/peers/SeedTest.java | 83 +++++++++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100644 test/java/net/yacy/peers/SeedDBTest.java create mode 100644 test/java/net/yacy/peers/SeedTest.java (limited to 'test/java') diff --git a/test/java/net/yacy/peers/SeedDBTest.java b/test/java/net/yacy/peers/SeedDBTest.java new file mode 100644 index 000000000..a787ae1ba --- /dev/null +++ b/test/java/net/yacy/peers/SeedDBTest.java @@ -0,0 +1,100 @@ +package net.yacy.peers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.io.File; +import java.net.InetAddress; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class SeedDBTest { + + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + private SeedDB seedDB; + + @Before + public void setUp() throws Exception { + final File networkRoot = this.temporaryFolder.newFolder("network"); + this.seedDB = new SeedDB( + networkRoot, + "seedActive.db", + "seedPassive.db", + "seedPotential.db", + new File(networkRoot, SeedDB.DBFILE_OWN_SEED), + 1, + 4, + false, + false); + } + + @After + public void tearDown() { + if (this.seedDB != null) this.seedDB.close(); + } + + @Test + public void lookupByIPFindsIPv6StoredInConnectedSeedIP6() throws Exception { + final Seed seed = seed("AAAAAAAAAAAA", "connected-peer", 8090); + seed.setIP("192.0.2.10"); + seed.setIP("2001:db8::10"); + this.seedDB.addConnected(seed); + + final Seed found = this.seedDB.lookupByIP(InetAddress.getByName("2001:db8::10"), 8090, true, false, false); + + assertEquals(seed.hash, found.hash); + } + + @Test + public void lookupByIPFindsIPv6StoredInDisconnectedSeedIP6() throws Exception { + final Seed seed = seed("BBBBBBBBBBBB", "disconnected-peer", 8091); + seed.setIP("192.0.2.11"); + seed.setIP("2001:db8::11"); + this.seedDB.addDisconnected(seed); + + final Seed found = this.seedDB.lookupByIP(InetAddress.getByName("2001:db8::11"), 8091, false, true, false); + + assertEquals(seed.hash, found.hash); + } + + @Test + public void lookupByIPFindsIPv6StoredInPotentialSeedIP6() throws Exception { + final Seed seed = seed("CCCCCCCCCCCC", "potential-peer", 8092); + seed.setIP("192.0.2.12"); + seed.setIP("2001:db8::12"); + this.seedDB.addPotential(seed); + + final Seed found = this.seedDB.lookupByIP(InetAddress.getByName("2001:db8::12"), 8092, false, false, true); + + assertEquals(seed.hash, found.hash); + } + + @Test + public void lookupByIPHonorsPortForIPv6FallbackMatches() throws Exception { + final Seed seed = seed("DDDDDDDDDDDD", "port-peer", 8093); + seed.setIP("192.0.2.13"); + seed.setIP("2001:db8::13"); + this.seedDB.addConnected(seed); + + final Seed found = this.seedDB.lookupByIP(InetAddress.getByName("2001:db8::13"), 8094, true, false, false); + + assertNull(found); + } + + private static Seed seed(final String hash, final String name, final int port) { + final ConcurrentMap dna = new ConcurrentHashMap(); + final Seed seed = new Seed(hash, dna); + seed.setName(name); + seed.setType(Seed.PEERTYPE_SENIOR); + seed.setPort(port); + return seed; + } +} diff --git a/test/java/net/yacy/peers/SeedTest.java b/test/java/net/yacy/peers/SeedTest.java new file mode 100644 index 000000000..6e221d843 --- /dev/null +++ b/test/java/net/yacy/peers/SeedTest.java @@ -0,0 +1,83 @@ +package net.yacy.peers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Set; +import java.util.HashSet; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.junit.Test; + +public class SeedTest { + + private static Seed seed() { + final ConcurrentMap dna = new ConcurrentHashMap(); + return new Seed("testseedhash", dna); + } + + @Test + public void setIPAddsIPv6WithoutReplacingExistingIPv6Entries() { + final Seed seed = seed(); + seed.setIP("192.0.2.10"); + seed.setIP("2001:db8::1"); + seed.setIP("2001:db8::2"); + + assertEquals("192.0.2.10", seed.get(Seed.IP, "")); + assertTrue(seed.getIPs().contains("2001:db8::1")); + assertTrue(seed.getIPs().contains("2001:db8::2")); + assertEquals(3, seed.countIPs()); + } + + @Test + public void setIPPreservesIPv6OnlyPrimaryWhenIPv4BecomesAvailable() { + final Seed seed = seed(); + seed.setIP("2001:db8::1"); + seed.setIP("192.0.2.10"); + + assertEquals("192.0.2.10", seed.get(Seed.IP, "")); + assertTrue(seed.getIPs().contains("2001:db8::1")); + assertTrue(seed.getIPs().contains("192.0.2.10")); + assertEquals(2, seed.countIPs()); + } + + @Test + public void setIPNormalizesZoneIdsAndAvoidsDuplicateIPv6Entries() { + final Seed seed = seed(); + seed.setIP("192.0.2.10"); + seed.setIP("fe80::1%en0"); + seed.setIP("fe80::1%eth0"); + + final Set ips = seed.getIPs(); + assertTrue(ips.contains("fe80::1")); + assertFalse(ips.contains("fe80::1%en0")); + assertFalse(ips.contains("fe80::1%eth0")); + assertEquals(2, seed.countIPs()); + } + + @Test + public void clashMatchesIPv6WithZoneId() { + final Seed seed = seed(); + seed.setIP("192.0.2.10"); + seed.setIP("fe80::1"); + + final Set otherIPs = new HashSet(); + otherIPs.add("fe80::1%en0"); + + assertTrue(seed.clash(otherIPs)); + } + + @Test + public void clashMatchesEquivalentIPv6TextForms() { + final Seed seed = seed(); + seed.setIP("192.0.2.10"); + seed.setIP("2001:db8::1"); + + final Set otherIPs = new HashSet(); + otherIPs.add("2001:db8:0:0:0:0:0:1"); + + assertTrue(seed.clash(otherIPs)); + } +} -- cgit v1.2.3