@Test
  public void testFailoverOnUndeploy() throws Exception {
    // Container is unmanaged, so start it ourselves
    this.start(0);
    this.deploy(0);

    final ContextSelector<EJBClientContext> selector =
        EJBClientContextSelector.setup(CLIENT_PROPERTIES);

    try {
      ViewChangeListener listener =
          context.lookupStateless(ViewChangeListenerBean.class, ViewChangeListener.class);

      this.establishView(listener, NODES[0]);

      Stateless bean = context.lookupStateless(StatelessBean.class, Stateless.class);

      assertEquals(NODES[0], bean.getNodeName());

      this.start(1);
      this.deploy(1);

      this.establishView(listener, NODES);

      List<String> results = new ArrayList<String>(10);
      for (int i = 0; i < 10; ++i) {
        results.add(bean.getNodeName());
      }

      for (int i = 0; i < NODES.length; ++i) {
        int frequency = Collections.frequency(results, NODES[i]);
        Assert.assertTrue(String.valueOf(frequency), frequency > 0);
      }

      this.undeploy(0);

      this.establishView(listener, NODES[1]);

      assertEquals(NODES[1], bean.getNodeName());
    } finally {
      // reset the selector
      if (selector != null) {
        EJBClientContext.setSelector(selector);
      }
      // shutdown the containers
      for (int i = 0; i < NODES.length; ++i) {
        this.undeploy(i);
        this.stop(i);
      }
    }
  }
  @Test
  public void test() throws Exception {

    String cluster = "server";
    String nodeNameFormat = "%s/%s";
    String nodeName1 = String.format(nodeNameFormat, NODE_1, cluster);
    String nodeName2 = String.format(nodeNameFormat, NODE_2, cluster);

    ContextSelector<EJBClientContext> selector = EJBClientContextSelector.setup(CLIENT_PROPERTIES);

    try {
      ServiceProviderRetriever bean =
          context.lookupStateless(
              ServiceProviderRetrieverBean.class, ServiceProviderRetriever.class);
      Collection<String> names = bean.getProviders();
      assertEquals(2, names.size());
      assertTrue(names.toString(), names.contains(nodeName1));
      assertTrue(names.toString(), names.contains(nodeName2));

      undeploy(DEPLOYMENT_1);

      names = bean.getProviders();
      assertEquals(1, names.size());
      assertTrue(names.contains(nodeName2));

      deploy(DEPLOYMENT_1);

      names = bean.getProviders();
      assertEquals(2, names.size());
      assertTrue(names.contains(nodeName1));
      assertTrue(names.contains(nodeName2));

      stop(CONTAINER_2);

      names = bean.getProviders();
      assertEquals(1, names.size());
      assertTrue(names.contains(nodeName1));

      start(CONTAINER_2);

      names = bean.getProviders();
      assertEquals(2, names.size());
      assertTrue(names.contains(nodeName1));
      assertTrue(names.contains(nodeName2));
    } finally {
      // reset the selector
      if (selector != null) {
        EJBClientContext.setSelector(selector);
      }
    }
  }
  /** Basic load balance testing. A random distribution is used amongst nodes for client now. */
  @Test
  public void testLoadbalance() throws Exception {
    this.start(0);
    this.deploy(0);
    this.start(1);
    this.deploy(1);

    final ContextSelector<EJBClientContext> previousSelector =
        EJBClientContextSelector.setup(CLIENT_PROPERTIES);

    int numberOfServers = 2;
    int numberOfCalls = 50;
    // there will be at least 20% of calls processed by all servers
    double serversProccessedAtLeast = 0.2;

    try {
      ViewChangeListener listener =
          context.lookupStateless(ViewChangeListenerBean.class, ViewChangeListener.class);

      this.establishView(listener, NODES);

      Stateless bean = context.lookupStateless(StatelessBean.class, Stateless.class);

      String node = bean.getNodeName();
      log.info("Node called : " + node);

      validateBalancing(bean, numberOfCalls, numberOfServers, serversProccessedAtLeast);

      Properties contextChangeProperties = new Properties();
      contextChangeProperties.put(REMOTE_PORT_PROPERTY_NAME, PORT_2.toString());
      contextChangeProperties.put(REMOTE_HOST_PROPERTY_NAME, HOST_2.toString());
      EJBClientContextSelector.setup(CLIENT_PROPERTIES, contextChangeProperties);

      bean = context.lookupStateless(StatelessBean.class, Stateless.class);
      node = bean.getNodeName();
      log.info("Node called : " + node);

      validateBalancing(bean, numberOfCalls, numberOfServers, serversProccessedAtLeast);

      this.stop(0);

      this.establishView(listener, NODES[1]);

      node = bean.getNodeName();
      log.info("Node called : " + node);

      this.start(0);

      this.establishView(listener, NODES);

      node = bean.getNodeName();
      log.info("Node called : " + node);

      validateBalancing(bean, numberOfCalls, numberOfServers, serversProccessedAtLeast);
    } finally {
      // reset the selector
      if (previousSelector != null) {
        EJBClientContext.setSelector(previousSelector);
      }
      // shutdown the containers
      for (int i = 0; i < NODES.length; ++i) {
        this.undeploy(i);
        this.stop(i);
      }
    }
  }