public void testReconnect() {
    List<DiscoveryNode> nodes = generateNodes();
    NodeConnectionsService service =
        new NodeConnectionsService(Settings.EMPTY, THREAD_POOL, transportService);

    ClusterState current = clusterStateFromNodes(Collections.emptyList());
    ClusterChangedEvent event =
        new ClusterChangedEvent("test", clusterStateFromNodes(randomSubsetOf(nodes)), current);

    transport.randomConnectionExceptions = true;

    service.connectToNodes(event.nodesDelta().addedNodes());

    for (int i = 0; i < 3; i++) {
      // simulate disconnects
      for (DiscoveryNode node : randomSubsetOf(nodes)) {
        transport.disconnectFromNode(node);
      }
      service.new ConnectionChecker().run();
    }

    // disable exceptions so things can be restored
    transport.randomConnectionExceptions = false;
    service.new ConnectionChecker().run();
    assertConnectedExactlyToNodes(event.state());
  }