@Test
  public void testSubmitToAllMembersCallable() throws InterruptedException {
    final int k = simpleTestNodeCount;
    TestHazelcastInstanceFactory factory = createHazelcastInstanceFactory(k);
    final HazelcastInstance[] instances = factory.newInstances(new Config());
    final AtomicInteger count = new AtomicInteger(0);
    final CountDownLatch countDownLatch = new CountDownLatch(k * k);
    final MultiExecutionCallback callback =
        new MultiExecutionCallback() {
          public void onResponse(Member member, Object value) {
            count.incrementAndGet();
            countDownLatch.countDown();
          }

          public void onComplete(Map<Member, Object> values) {}
        };
    for (int i = 0; i < k; i++) {
      final IExecutorService service =
          instances[i].getExecutorService("testSubmitToAllMembersCallable");
      final String script =
          "hazelcast.getAtomicLong('testSubmitToAllMembersCallable').incrementAndGet();";
      service.submitToAllMembers(new ScriptCallable(script, null), callback);
    }
    countDownLatch.await(30, TimeUnit.SECONDS);
    final IAtomicLong result = instances[0].getAtomicLong("testSubmitToAllMembersCallable");
    assertEquals(k * k, result.get());
    assertEquals(k * k, count.get());
  }
  @Test
  public void submitRunnableToAllMembers_withMultiExecutionCallback() throws Exception {
    IExecutorService service = client.getExecutorService(randomString());

    final CountDownLatch responseLatch = new CountDownLatch(CLUSTER_SIZE);
    final CountDownLatch completeLatch = new CountDownLatch(1);
    String mapName = randomString();
    Runnable runnable = new MapPutRunnable(mapName);

    service.submitToAllMembers(
        runnable,
        new MultiExecutionCallback() {
          public void onResponse(Member member, Object value) {
            responseLatch.countDown();
          }

          public void onComplete(Map<Member, Object> values) {
            completeLatch.countDown();
          }
        });
    IMap map = client.getMap(mapName);

    assertOpenEventually("responseLatch", responseLatch);
    assertOpenEventually("completeLatch", completeLatch);
    assertEquals(CLUSTER_SIZE, map.size());
  }
  @Test
  public void submitCallableWithNullResultToAllMembers_withMultiExecutionCallback()
      throws Exception {
    IExecutorService service = client.getExecutorService(randomString());

    final CountDownLatch responseLatch = new CountDownLatch(CLUSTER_SIZE);
    final CountDownLatch completeLatch = new CountDownLatch(CLUSTER_SIZE);
    Callable callable = new NullCallable();

    service.submitToAllMembers(
        callable,
        new MultiExecutionCallback() {
          public void onResponse(Member member, Object value) {
            if (value == null) {
              responseLatch.countDown();
            }
          }

          public void onComplete(Map<Member, Object> values) {
            for (Member member : values.keySet()) {
              Object value = values.get(member);
              if (value == null) {
                completeLatch.countDown();
              }
            }
          }
        });

    assertOpenEventually("responseLatch", responseLatch);
    assertOpenEventually("completeLatch", completeLatch);
  }
  @Test
  public void submitCallableToAllMembers() throws Exception {
    IExecutorService service = client.getExecutorService(randomString());

    String msg = randomString();
    Callable<String> callable = new AppendCallable(msg);

    Map<Member, Future<String>> map = service.submitToAllMembers(callable);
    for (Member member : map.keySet()) {
      Future<String> result = map.get(member);
      assertEquals(msg + AppendCallable.APPENDAGE, result.get());
    }
  }
  /**
   * Submits a task to multiple members of the Hazelcast task cluster.
   *
   * @param task The task
   * @param where A {@link MemberSelector}, an {@link Iterable} of {@link Member}, a string
   *     (comma-separated member tags), or null for all members
   * @return A map of members to futures for the task
   */
  @SuppressWarnings("unchecked")
  private <T> Map<Member, Future<T>> multiTask(SerializableApplicationTask<T> task, Object where) {
    IExecutorService executor = getHazelcastExecutorService();

    if (where instanceof String)
      return executor.submitToMembers(
          task, new TaggedMembers(HAZELCAST_MEMBER_TAGS_ATTRIBUTE, (String) where));
    else if (where instanceof MemberSelector)
      return executor.submitToMembers(task, (MemberSelector) where);
    else if (where instanceof Collection)
      return executor.submitToMembers(task, (Collection<Member>) where);
    else if (where instanceof Iterable) {
      ArrayList<Member> members = new ArrayList<Member>();
      for (Member member : (Iterable<Member>) where) members.add(member);
      return executor.submitToMembers(task, members);
    } else return executor.submitToAllMembers(task);
  }