FutureBootstrap futureBootstrap = unreachablePeer.bootstrap().peerAddress(peers[0].peerAddress()).start();
futureBootstrap.awaitUninterruptibly();
Assert.assertTrue(futureBootstrap.isSuccess());
// setup relay and lower the update interval to 5s
PeerNAT uNat = new PeerBuilderNAT(unreachablePeer).relayType(relayType).gcmServerCredentials(gcmServerCredentials).peerMapUpdateInterval(5).start();
FutureRelayNAT startRelay = uNat.startRelay(peers[0].peerAddress());
FutureRelay frNAT = startRelay.awaitUninterruptibly().futureRelay();
Assert.assertTrue(startRelay.isSuccess());
mockGCM(peers, uNat);
PeerAddress relayPeer = frNAT.relays().iterator().next().relayAddress();
Peer found = null;
for (Peer p : peers) {
if (p.peerAddress().equals(relayPeer)) {
found = p;
break;
}
}
Assert.assertNotNull(found);
// wait for at least one map update task (5s)
Thread.sleep(5000);
int nrOfNeighbors = getNeighbors(found).size();
// we have in total 9 peers, we should find 8 as neighbors
Assert.assertEquals(8, nrOfNeighbors);
System.err.println("neighbors: " + nrOfNeighbors);
for (BaseRelayConnection relay : frNAT.relays()) {
System.err.println("pc:" + relay.relayAddress());
}
Assert.assertEquals(relayType.maxRelayCount(), frNAT.relays().size());
// Shut down a peer
peers[nrOfNodes - 1].shutdown().await();
peers[nrOfNodes - 2].shutdown().await();
peers[nrOfNodes - 3].shutdown().await();
/*
* needed because failure of a node is detected with periodic
* heartbeat and the routing table of the relay peers are also
* updated periodically
*/
Thread.sleep(uNat.peerMapUpdateInterval() * 1000);
Assert.assertEquals(nrOfNeighbors - 3, getNeighbors(found).size());
Assert.assertEquals(relayType.maxRelayCount(), frNAT.relays().size());
} finally {
if (unreachablePeer != null) {