package lbms.plugins.mldht.kad;
import static lbms.plugins.mldht.kad.NodeFactory.fillTable;
import static org.junit.Assert.assertEquals;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import org.junit.Before;
import org.junit.Test;
import lbms.plugins.mldht.DHTConfiguration;
import lbms.plugins.mldht.kad.DHT.DHTtype;
public class KClosestNodeSearchTest {
Node node;
@Before
public void setup() {
DHT dht = new DHT(DHTtype.IPV6_DHT);
dht.setScheduler(Executors.newScheduledThreadPool(0));
dht.populate();
dht.config = new DHTConfiguration() {
@Override
public boolean noRouterBootstrap() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isPersistingID() {
// TODO Auto-generated method stub
return false;
}
@Override
public Path getStoragePath() {
return Paths.get("./does.not.exist");
}
@Override
public int getListeningPort() {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean allowMultiHoming() {
// TODO Auto-generated method stub
return false;
}
};
node = dht.getNode();
node.initKey(dht.config);
node.registerId();
//node.registerServer(null);
//node.registerServer(null);
}
@Test
public void testOrdering() {
fillTable(node);
// KNS only accepts pinged entries
node.table().stream().forEach(b -> {
b.getBucket().entriesStream().forEach(e -> {
e.signalResponse(1);
});
});
Key k = Key.createRandomKey();
int targetSize = 32;
Comparator<KBucketEntry> comp = new KBucketEntry.DistanceOrder(k);
KClosestNodesSearch search = new KClosestNodesSearch(k, targetSize, node.getDHT());
search.fill();
List<KBucketEntry> result = search.getEntries();
List<KBucketEntry> reference = node.table().stream().flatMap(b -> b.getBucket().entriesStream()).filter(KBucketEntry::eligibleForNodesList).sorted(comp).limit(targetSize).collect(Collectors.toList());
List<KBucketEntry> sortedResult = new ArrayList<>(result);
sortedResult.sort(comp);
assertEquals(targetSize, result.size());
/*
List<RoutingTableEntry> entries = node.getBuckets();
System.out.println(k.toBinString()+"\n");
List<Prefix> ps = reference.stream().map(e -> {
int idx = Node.findIdxForId(entries, e.getID());
Node.RoutingTableEntry re = entries.get(idx);
return re.prefix;
}).distinct().collect(Collectors.toList());
ps.stream().forEachOrdered(p -> {
System.out.println(new Prefix(k.distance(p), p.depth));
});
System.out.println(" ");
ps.stream().forEachOrdered(p -> {
System.out.println(p);
});
reference.forEach(e -> {
System.out.println(e.getID().toBinString()+" "+k.distance(e.getID()).toBinString());
});
System.out.println(" ");
sortedResult.forEach(e -> {
System.out.println(e.getID().toBinString()+" "+k.distance(e.getID()).toBinString());
});
Diagnostics d = new Diagnostics();
d.formatRoutingTable(System.out, node);
*/
assertEquals(reference, sortedResult);
}
}