@Test
  public void testDuplicateUnregister() throws Exception {
    _registry.register(FOO);

    _registry.unregister(FOO);
    _registry.unregister(FOO);
  }
  @Test
  public void testServiceNodeIsDeletedWhenRegistryIsClosed() throws Exception {
    ZooKeeperPersistentEphemeralNode node = mock(ZooKeeperPersistentEphemeralNode.class);
    when(_nodeFactory.create(anyString(), any(byte[].class))).thenReturn(node);

    _registry.register(FOO);

    _registry.close();

    verify(node).close(anyLong(), any(TimeUnit.class));
  }
  @Test
  public void testDuplicateRegister() throws Exception {
    ZooKeeperPersistentEphemeralNode firstNode = mock(ZooKeeperPersistentEphemeralNode.class);
    ZooKeeperPersistentEphemeralNode secondNode = mock(ZooKeeperPersistentEphemeralNode.class);
    when(_nodeFactory.create(anyString(), any(byte[].class))).thenReturn(firstNode, secondNode);

    _registry.register(FOO);
    _registry.register(FOO);

    verify(_nodeFactory, times(2)).create(eq(FOO_PATH), Matchers.<byte[]>any());
    verify(firstNode).close(anyLong(), any(TimeUnit.class));
  }
  @Test
  public void testRegister() throws Exception {
    ZooKeeperPersistentEphemeralNode node = mock(ZooKeeperPersistentEphemeralNode.class);
    when(_nodeFactory.create(anyString(), any(byte[].class))).thenReturn(node);

    _registry.register(FOO);

    ArgumentCaptor<byte[]> dataCaptor = ArgumentCaptor.forClass(byte[].class);

    verify(_nodeFactory).create(eq(FOO_PATH), dataCaptor.capture());
    assertEquals(FOO, ServiceEndPointJsonCodec.fromJson(new String(dataCaptor.getValue())));
    verify(node, never()).close(anyLong(), any(TimeUnit.class));
  }
 @Test(expected = IllegalStateException.class)
 public void testLargePayloadSize() {
   int padding = ServiceEndPointJsonCodec.toJson(FOO).getBytes(Charsets.UTF_8).length;
   String payload = Strings.repeat("x", MAX_DATA_SIZE - padding);
   _registry.register(newEndPoint(FOO.getServiceName(), FOO.getId(), payload), false);
 }
 @Test(expected = IllegalStateException.class)
 public void testUnregisterAfterClose() throws Exception {
   _registry.close();
   _registry.unregister(FOO);
 }
 @Test(expected = NullPointerException.class)
 public void testUnregisterNullService() throws Exception {
   _registry.unregister(null);
 }
 @After
 public void teardown() throws Exception {
   _registry.close();
 }
  @Test
  public void testUnregisterWithoutFirstRegistering() throws Exception {
    _registry.unregister(FOO);

    verify(_nodeFactory, never()).create(eq(FOO_PATH), Matchers.<byte[]>any());
  }
 @Test
 public void testEmptyPayload() {
   _registry.register(newEndPoint(FOO.getServiceName(), FOO.getId(), ""), false);
 }
 @Test
 public void testMediumPayloadSize() {
   int padding = ServiceEndPointJsonCodec.toJson(FOO).getBytes(Charsets.UTF_8).length;
   String payload = Strings.repeat("x", MAX_DATA_SIZE - padding - 1);
   _registry.register(newEndPoint(FOO.getServiceName(), FOO.getId(), payload), false);
 }