package microservices.sample.discovery.hazelcast;
import com.hazelcast.core.HazelcastInstance;
import microservices.sample.discovery.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.TimeUnit;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.*;
/**
* @author mamad
* @since 17/03/15.
*/
public class HazelcastServiceRegistryTest {
public static final String IP = "ip1";
public static final int PORT = 1;
public static final String VERSION = "v1";
//running two instances of service registry
ServiceRegistry registry1;
ServiceRegistry registry2;
ServiceDiscovery serviceDiscovery = new ServiceDiscoveryImpl();
@Before
public void setUp() throws Exception {
HazelcastInstance instance1 = HazelcastBuilder.create().withListener(new PublishServiceListener(serviceDiscovery)).build();
registry1 = new HazelcastServiceRegistry(instance1);
HazelcastInstance instance2 = HazelcastBuilder.create().withListener(new PublishServiceListener(serviceDiscovery)).build();
registry2 = new HazelcastServiceRegistry(instance2);
}
@After
public void tearDown() throws Exception {
registry1.shutdown();
registry2.shutdown();
}
@Test
@SuppressWarnings("unchecked")
public void testJoinLeave() throws Exception {
ServiceDiscoveryListener listener1 = mock(ServiceDiscoveryListener.class);
doAnswer(invocation -> {
Object arg = invocation.getArguments()[0];
assertTrue(arg instanceof PublishedServiceInfo);
PublishedServiceInfo info = (PublishedServiceInfo) arg;
assertThat(info.getServiceClass(), equalTo(String.class));
assertThat(info.getIp(), equalTo(IP));
assertThat(info.getPort(), equalTo(PORT));
assertThat(info.getVersion(), equalTo(VERSION));
return null;
}
).when(listener1).onServiceJoined(any(PublishedServiceInfo.class));
serviceDiscovery.addListener(listener1);
ServiceDiscoveryListener listener2 = mock(ServiceDiscoveryListener.class);
serviceDiscovery.addListener(listener2);
PublishedServiceInfo<String> serviceA = PublishedServiceInfo.of(String.class, IP, PORT, VERSION);
registry1.register(serviceA);
//give Hazelcast a little time to detect and notify discovery service
sleepFor(1, SECONDS);
verify(listener1, times(2)).onServiceJoined(any(PublishedServiceInfo.class));
verify(listener2, times(2)).onServiceJoined(any(PublishedServiceInfo.class));
//now leave the cluster
registry1.deRegister(serviceA);
sleepFor(1, SECONDS);
verify(listener1, times(2)).onServiceLeft(any(PublishedServiceInfo.class));
verify(listener2, times(2)).onServiceLeft(any(PublishedServiceInfo.class));
}
private void sleepFor(long amount, TimeUnit unit) throws InterruptedException {
Thread.sleep(unit.toMillis(amount));
}
}