package lbms.plugins.mldht.kad;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.stream.IntStream;
import org.junit.Before;
import org.junit.Test;
import lbms.plugins.mldht.kad.Node.InsertOptions;
public class NodeTest {
Node node;
@Before
public void setup() {
DHT dht = NodeFactory.buildDHT();
node = dht.getNode();
node.initKey(null);
NodeFactory.fillTable(node);
}
@Test
public void testBucketMerges() {
Prefix p = new Prefix(Key.createRandomKey(), 20);
List<KBucketEntry> added = new ArrayList<>();
for(int i=0;i<100;i++) {
KBucketEntry e = new KBucketEntry(new InetSocketAddress(NodeFactory.generateIp((byte) 0), 1337), p.createRandomKeyFromPrefix());
added.add(e);
e.signalResponse(0);
assertTrue(e.verifiedReachable());
assertTrue(e.eligibleForNodesList());
assertFalse(e.removableWithoutReplacement());
node.insertEntry(e, EnumSet.of(InsertOptions.ALWAYS_SPLIT_IF_FULL, InsertOptions.FORCE_INTO_MAIN_BUCKET));
}
// new Diagnostics().formatRoutingTable(System.out, node);
assertTrue(node.table().entryForId(p).prefix.getDepth() > p.getDepth());
node.mergeBuckets();
assertTrue(node.table().entryForId(p).prefix.getDepth() > p.getDepth());
added.forEach(e -> {
e.signalScheduledRequest();
IntStream.rangeClosed(0, KBucketEntry.MAX_TIMEOUTS).forEach(x -> e.signalRequestTimeout());
assertTrue(e.removableWithoutReplacement());
});
node.mergeBuckets();
assertTrue(node.table().entryForId(p).prefix.getDepth() < p.getDepth());
}
}