@Test(expected = NullPointerException.class)
  public void testRemoveClientListener_whenIdIsNull() {
    HazelcastInstance instance = Hazelcast.newHazelcastInstance();

    ClientService clientService = instance.getClientService();
    clientService.removeClientListener(null);
  }
  @Test
  public void testRemoveClientListener_whenNonExistingId() {
    HazelcastInstance instance = Hazelcast.newHazelcastInstance();

    ClientService clientService = instance.getClientService();

    clientService.removeClientListener("foobar");
  }
  @Test
  public void testClientListener() throws InterruptedException {
    final HazelcastInstance instance = Hazelcast.newHazelcastInstance();
    final ClientService clientService = instance.getClientService();
    final CountDownLatch latchAdd = new CountDownLatch(2);
    final CountDownLatch latchRemove = new CountDownLatch(2);
    final AtomicInteger totalAdd = new AtomicInteger(0);

    final ClientListener clientListener =
        new ClientListener() {
          @Override
          public void clientConnected(Client client) {
            totalAdd.incrementAndGet();
            latchAdd.countDown();
          }

          @Override
          public void clientDisconnected(Client client) {
            latchRemove.countDown();
          }
        };
    final String id = clientService.addClientListener(clientListener);

    final HazelcastInstance client1 = HazelcastClient.newHazelcastClient();
    final HazelcastInstance client2 = HazelcastClient.newHazelcastClient();

    client1.getLifecycleService().shutdown();
    client2.getLifecycleService().shutdown();

    assertTrue(latchAdd.await(6, TimeUnit.SECONDS));
    assertTrue(latchRemove.await(6, TimeUnit.SECONDS));

    assertTrue(clientService.removeClientListener(id));

    assertFalse(clientService.removeClientListener("foo"));

    assertEquals(0, clientService.getConnectedClients().size());

    final HazelcastInstance client3 = HazelcastClient.newHazelcastClient();

    assertTrueEventually(
        new AssertTask() {
          @Override
          public void run() throws Exception {
            assertEquals(1, clientService.getConnectedClients().size());
          }
        },
        4);

    assertEquals(2, totalAdd.get());
  }
  @Test
  public void testRemoveClientListener_whenListenerAlreadyRemoved() {
    HazelcastInstance instance = Hazelcast.newHazelcastInstance();

    ClientService clientService = instance.getClientService();
    ClientListener clientListener = mock(ClientListener.class);
    String id = clientService.addClientListener(clientListener);

    // first time remove
    clientService.removeClientListener(id);

    // second time remove
    clientService.removeClientListener(id);
  }
  @Test
  public void testConnectedClients() {
    final HazelcastInstance instance = Hazelcast.newHazelcastInstance();

    final HazelcastInstance client1 = HazelcastClient.newHazelcastClient();
    final HazelcastInstance client2 = HazelcastClient.newHazelcastClient();

    final ClientService clientService = instance.getClientService();
    final Collection<Client> connectedClients = clientService.getConnectedClients();
    assertEquals(2, connectedClients.size());

    final String uuid1 = client1.getLocalEndpoint().getUuid();
    final String uuid2 = client2.getLocalEndpoint().getUuid();
    for (Client connectedClient : connectedClients) {
      final String uuid = connectedClient.getUuid();
      assertTrue(uuid.equals(uuid1) || uuid.equals(uuid2));
    }
  }
  @Test
  public void testClientListenerForBothNodes() {
    final HazelcastInstance instance1 = Hazelcast.newHazelcastInstance();
    final HazelcastInstance instance2 = Hazelcast.newHazelcastInstance();
    final ClientConnectedListenerLatch clientListenerLatch = new ClientConnectedListenerLatch(2);

    final ClientService clientService1 = instance1.getClientService();
    clientService1.addClientListener(clientListenerLatch);
    final ClientService clientService2 = instance2.getClientService();
    clientService2.addClientListener(clientListenerLatch);

    final HazelcastInstance client = HazelcastClient.newHazelcastClient();
    final String instance1Key = generateKeyOwnedBy(instance1);
    final String instance2Key = generateKeyOwnedBy(instance2);

    final IMap<Object, Object> map = client.getMap("map");
    map.put(instance1Key, 0);
    map.put(instance2Key, 0);

    assertClientConnected(clientService1, clientService2);
    assertOpenEventually(clientListenerLatch, 5);
  }