package com.networknt.consul;
import com.networknt.consul.client.ConsulClient;
import com.networknt.registry.Registry;
import com.networknt.registry.URLImpl;
import com.networknt.registry.URLParamType;
import com.networknt.registry.support.command.CommandListener;
import com.networknt.registry.support.command.ServiceListener;
import com.networknt.registry.URL;
import com.networknt.service.SingletonServiceFactory;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import java.util.logging.ConsoleHandler;
public class ConsulRegistryTest {
private MockConsulClient client;
private ConsulRegistry registry;
private URL serviceUrl, serviceUrl2, clientUrl, clientUrl2;
private String serviceid, serviceid2;
private long sleepTime;
@Before
public void setUp() throws Exception {
client = (MockConsulClient)SingletonServiceFactory.getBean(ConsulClient.class);
registry = (ConsulRegistry)SingletonServiceFactory.getBean(Registry.class);
serviceUrl = MockUtils.getMockUrl(8001);
serviceUrl2 = MockUtils.getMockUrl(8002);
serviceid = ConsulUtils.convertConsulSerivceId(serviceUrl);
serviceid2 = ConsulUtils.convertConsulSerivceId(serviceUrl2);
clientUrl = MockUtils.getMockUrl("127.0.0.1", 0);
clientUrl2 = MockUtils.getMockUrl("127.0.0.2", 0);
sleepTime = ConsulConstants.SWITCHER_CHECK_CIRCLE + 500;
}
@After
public void tearDown() throws Exception {
registry = null;
client = null;
}
@Test
public void doRegisterAndAvailable() throws Exception {
// register
registry.doRegister(serviceUrl);
registry.doRegister(serviceUrl2);
Assert.assertTrue(client.isRegistered(serviceid));
Assert.assertFalse(client.isWorking(serviceid));
Assert.assertTrue(client.isRegistered(serviceid2));
Assert.assertFalse(client.isWorking(serviceid2));
// available
registry.doAvailable(null);
Thread.sleep(sleepTime);
Assert.assertTrue(client.isWorking(serviceid));
Assert.assertTrue(client.isWorking(serviceid2));
// unavailable
registry.doUnavailable(null);
Thread.sleep(sleepTime);
Assert.assertFalse(client.isWorking(serviceid));
Assert.assertFalse(client.isWorking(serviceid2));
// unregister
registry.doUnregister(serviceUrl);
Assert.assertFalse(client.isRegistered(serviceid));
Assert.assertTrue(client.isRegistered(serviceid2));
registry.doUnregister(serviceUrl2);
Assert.assertFalse(client.isRegistered(serviceid2));
}
private ServiceListener createNewServiceListener(final URL serviceUrl) {
return new ServiceListener() {
@Override
public void notifyService(URL refUrl, URL registryUrl, List<URL> urls) {
if (!urls.isEmpty()) {
Assert.assertTrue(urls.contains(serviceUrl));
}
}
};
}
@Test
public void subAndUnsubService() throws Exception {
ServiceListener serviceListener = createNewServiceListener(serviceUrl);
ServiceListener serviceListener2 = createNewServiceListener(serviceUrl);
registry.subscribeService(clientUrl, serviceListener);
registry.subscribeService(clientUrl2, serviceListener2);
Assert.assertTrue(containsServiceListener(serviceUrl, clientUrl, serviceListener));
Assert.assertTrue(containsServiceListener(serviceUrl, clientUrl2, serviceListener2));
registry.doRegister(serviceUrl);
registry.doRegister(serviceUrl2);
registry.doAvailable(null);
Thread.sleep(sleepTime);
registry.unsubscribeService(clientUrl, serviceListener);
Assert.assertFalse(containsServiceListener(serviceUrl, clientUrl, serviceListener));
Assert.assertTrue(containsServiceListener(serviceUrl, clientUrl2, serviceListener2));
registry.unsubscribeService(clientUrl2, serviceListener2);
Assert.assertFalse(containsServiceListener(serviceUrl, clientUrl2, serviceListener2));
}
@Test
public void subAndUnsubCommand() throws Exception {
final String command = "{\"index\":0,\"mergeGroups\":[\"aaa:1\",\"bbb:1\"],\"pattern\":\"*\",\"routeRules\":[]}\n";
CommandListener commandListener = new CommandListener() {
@Override
public void notifyCommand(URL refUrl, String commandString) {
if (commandString != null) {
Assert.assertTrue(commandString.equals(command));
}
}
};
registry.subscribeCommand(clientUrl, commandListener);
Assert.assertTrue(containsCommandListener(serviceUrl, clientUrl, commandListener));
client.setKVValue(clientUrl.getPath(), command);
Thread.sleep(2000);
client.removeKVValue(clientUrl.getPath());
registry.unsubscribeCommand(clientUrl, commandListener);
Assert.assertFalse(containsCommandListener(serviceUrl, clientUrl, commandListener));
}
@Test
public void discoverService() throws Exception {
registry.doRegister(serviceUrl);
List<URL> urls = registry.discoverService(serviceUrl);
Assert.assertFalse(urls.contains(serviceUrl));
registry.doAvailable(null);
Thread.sleep(sleepTime);
urls = registry.discoverService(serviceUrl);
Assert.assertTrue(urls.contains(serviceUrl));
}
@Test
public void discoverCommand() throws Exception {
String result = registry.discoverCommand(clientUrl);
Assert.assertTrue(result.equals(""));
String command = "{\"index\":0,\"mergeGroups\":[\"aaa:1\",\"bbb:1\"],\"pattern\":\"*\",\"routeRules\":[]}\n";
client.setKVValue(clientUrl.getPath(), command);
result = registry.discoverCommand(clientUrl);
Assert.assertTrue(result.equals(command));
}
private Boolean containsServiceListener(URL serviceUrl, URL clientUrl, ServiceListener serviceListener) {
String service = ConsulUtils.getUrlClusterInfo(serviceUrl);
return registry.getServiceListeners().get(service).get(clientUrl) == serviceListener;
}
private Boolean containsCommandListener(URL serviceUrl, URL clientUrl, CommandListener commandListener) {
String serviceName = serviceUrl.getPath();
return registry.getCommandListeners().get(serviceName).get(clientUrl) == commandListener;
}
}