/*
* Copyright (c) [2016] [ <ether.camp> ]
* This file is part of the ethereumJ library.
*
* The ethereumJ library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The ethereumJ library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>.
*/
package org.ethereum.net.swarm;
import org.ethereum.net.rlpx.Node;
import org.ethereum.net.rlpx.discover.table.NodeTable;
import org.junit.Ignore;
import org.junit.Test;
import java.util.*;
/**
* Created by Admin on 01.07.2015.
*/
public class KademliaTest {
@Ignore
@Test
public void nodesConnectivityTest() {
Map<Node, Integer> nameMap = new IdentityHashMap<>();
Node[] nodes = new Node[300];
NodeTable table = getTestNodeTable();
for (int i = 0; i < nodes.length; i++) {
nodes[i] = getNode(1000 + i);
table.addNode(nodes[i]);
nameMap.put(nodes[i], i);
}
Map<Node, Set<Node>> reachable = new IdentityHashMap<>();
for (Node node : nodes) {
Map<Node, Object> reachnodes = new IdentityHashMap<>();
reachable.put(node, reachnodes.keySet());
List<Node> closestNodes = table.getClosestNodes(node.getId());
int max = 16;
for (Node closestNode : closestNodes) {
reachnodes.put(closestNode, null);
if (--max == 0) break;
}
}
for (Node node : nodes) {
System.out.println("Closing node " + nameMap.get(node));
Map<Node, Object> closure = new IdentityHashMap<>();
addAll(reachable, reachable.get(node), closure.keySet());
reachable.put(node, closure.keySet());
}
for (Map.Entry<Node, Set<Node>> entry : reachable.entrySet()) {
System.out.println("Node " + nameMap.get(entry.getKey())
+ " has " + entry.getValue().size() + " neighbours");
// for (Node nb : entry.getValue()) {
// System.out.println(" " + nameMap.get(nb));
// }
}
}
static Random gen = new Random(0);
public static byte[] getNodeId() {
byte[] id = new byte[64];
gen.nextBytes(id);
return id;
}
public static Node getNode(int port) {
return new Node(getNodeId(), "127.0.0.1", port);
}
public static NodeTable getTestNodeTable() {
NodeTable testTable = new NodeTable(getNode(3333));
return testTable;
}
private void addAll(Map<Node, Set<Node>> reachableMap, Set<Node> reachable, Set<Node> ret) {
for (Node node : reachable) {
if (!ret.contains(node)) {
ret.add(node);
addAll(reachableMap, reachableMap.get(node), ret);
}
}
}
}