package com.dianping.pigeon.registry.zookeeper;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.curator.test.TestingServer;
import org.apache.zookeeper.KeeperException;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.dianping.pigeon.config.ConfigManagerLoader;
import com.dianping.pigeon.extension.ExtensionLoader;
import com.dianping.pigeon.registry.Registry;
import com.dianping.pigeon.registry.exception.RegistryException;
import com.dianping.pigeon.registry.listener.RegistryEventListener;
public class CuratorRegistryTest {
private static TestingServer server = null;
@BeforeClass
public static void startTestServer() throws Exception {
server = new TestingServer();
ConfigManagerLoader.getConfigManager().setLocalStringValue("pigeon.registry.address",
server.getConnectString());
/*ConfigManagerLoader.getConfigManager().setLocalStringValue(Constants.KEY_REGISTRY_ADDRESS,
"10.66.15.109:2181");*/
}
@AfterClass
public static void stopTestServer() throws Exception {
if (server != null) {
server.close();
server = null;
}
}
@Test
public void tsetCreate() {
CuratorRegistry registry = new CuratorRegistry();
registry.init();
assertEquals(registry.getName(), "curator");
try {
registry.getCuratorClient().create("/DP/APPNAME/pigeon-invoker-demo");
} catch (Exception e) {
if (e instanceof KeeperException.NodeExistsException) {
System.out.println(1111);
}
e.printStackTrace();
}
}
@Test
public void testGetName() {
Registry registry = ExtensionLoader.getExtension(Registry.class);
registry.init();
assertEquals(registry.getName(), "curator");
}
@Test
public void testRegisterService() throws Exception {
Registry registry = ExtensionLoader.getExtension(Registry.class);
registry.init();
registry.registerService("srv_a", "group_a", "1.1.1.1:1234", 5);
assertEquals(registry.getServiceAddress("srv_a", "group_a"), "1.1.1.1:1234");
assertEquals(registry.getServerWeight("1.1.1.1:1234"), 5);
assertEquals(registry.getServiceAddress("srv_a"), "");
}
@Test
public void testRegisterService2() throws Exception {
CuratorRegistry registry = new CuratorRegistry();
registry.init();
registry.registerPersistentNode("srv_a", "group_a", "1.1.1.1:1234", 5);
registry.registerPersistentNode("srv_a", "group_a", "1.1.1.2:1234", 5);
registry.registerPersistentNode("srv_a", "group_a", "1.1.1.3:1234", 5);
String oldHosts = registry.getServiceAddress("srv_a", "group_a");
System.out.println("Old hosts: " + oldHosts);
assertTrue(oldHosts.contains("1.1.1.2:1234"));
assertFalse(oldHosts.contains("1.1.1.4:1234"));
String srvHosts = registry.getServiceAddress("srv_a", "group_a");
assertTrue(srvHosts.contains("1.1.1.2:1234"));
assertTrue(srvHosts.contains("1.1.1.4:1234"));
System.out.println("All hosts: " + srvHosts);
}
@Test
public void testUnregisterServiceStringString() throws Exception {
Registry registry = ExtensionLoader.getExtension(Registry.class);
registry.init();
registry.registerService("srv_a", "group_a", "1.1.1.1:1234", 5);
registry.unregisterService("srv_a", "group_a", "1.1.1.1:1234");
assertEquals(registry.getServiceAddress("srv_a", "group_a"), "");
assertEquals(registry.getServerWeight("1.1.1.1:1234"), 5);
}
@Test
public void testUnregisterServiceStringStringString() {
fail("Not yet implemented");
}
@Test
public void testSetServerWeight() throws Exception {
Registry registry = ExtensionLoader.getExtension(Registry.class);
registry.init();
registry.registerService("srv_a", "group_a", "1.1.1.1:1234", 5);
assertEquals(registry.getServerWeight("1.1.1.1:1234"), 5);
registry.setServerWeight("1.1.1.1:1234", 7);
assertEquals(registry.getServerWeight("1.1.1.1:1234"), 7);
}
@Test
public void testGetChildren() throws Exception {
Registry registry = ExtensionLoader.getExtension(Registry.class);
registry.init();
registry.registerService("srv_a", "group_a", "1.1.1.1:1234", 5);
registry.registerService("srv_a", "group_a", "1.1.1.2:1234", 6);
registry.registerService("srv_a", "group_a", "1.1.1.3:1234", 7);
assertTrue(registry.getServiceAddress("srv_a", "group_a").contains("1.1.1.2:1234"));
assertEquals(registry.getChildren("/DP/SERVICE/srv_a@group_a").size(), 3);
}
@Test
public void testWatch() throws Exception {
CuratorRegistry registry = new CuratorRegistry();
registry.init();
CuratorClient client = registry.getCuratorClient();
client.watch("/DP/SERVER/a");
client.watchChildren("/DP/SERVICE/a");
client.create("/DP/SERVER/a", "1.1.1.1:1111");
client.set("/DP/SERVER/a", "1.1.1.1:1112");
client.set("/DP/SERVER/a", "1.1.1.1:1113");
client.delete("/DP/SERVER/a");
client.create("/DP/SERVER/a", "2.2.2.2:2222");
client.createEphemeral("/DP/SERVICE/a/3.3.3.3:3333");
client.createEphemeral("/DP/SERVICE/a/4.4.4.4:4444");
client.delete("/DP/SERVICE/a/4.4.4.4:4444");
client.delete("/DP/SERVICE/a/3.3.3.3:3333");
client.delete("/DP/SERVICE/a");
client.createEphemeral("/DP/SERVICE/a/5.5.5.5:5555");
client.createEphemeral("/DP/SERVICE/a/6.6.6.6:6666");
TimeUnit.SECONDS.sleep(10);
}
@Test
public void integrateTest() throws Exception {
CuratorRegistry registry = new CuratorRegistry();
registry.init();
Process oldProcess1 = new Process(false);
Process oldProcess2 = new Process(false);
Process newProcess1 = new Process(true);
Process newProcess2 = new Process(true);
Process newProcess3 = new Process(true);
oldProcess1.register();
oldProcess2.register();
newProcess1.register();
newProcess2.register();
newProcess3.register();
String serviceAddress = registry.getServiceAddress(serviceName, group);
System.out.println(serviceAddress);
oldProcess1.unregister();
serviceAddress = registry.getServiceAddress(serviceName, group);
System.out.println(serviceAddress);
oldProcess1.register();
serviceAddress = registry.getServiceAddress(serviceName, group);
System.out.println(serviceAddress);
newProcess1.unregister();
serviceAddress = registry.getServiceAddress(serviceName, group);
System.out.println(serviceAddress);
newProcess1.register();
serviceAddress = registry.getServiceAddress(serviceName, group);
System.out.println(serviceAddress);
newProcess3.unregister();
RegistryEventListener.providerRemoved(serviceName, ip, newProcess3.getPort());
TimeUnit.SECONDS.sleep(3);
oldProcess1.unregister();
RegistryEventListener.providerRemoved(serviceName, ip, oldProcess1.getPort());
}
static final String serviceName = "service_test";
static final String group = "group_test";
static final String ip = "1.1.1.1";
static final AtomicInteger seq = new AtomicInteger(1111);
static final int weight = 10;
static class Process extends Thread {
CuratorRegistry registry = null;
boolean isEphemeral = false;
String serverAddress = null;
volatile boolean isExit = false;
int port = 0;
public Process(boolean isEphemeral) {
this.isEphemeral = isEphemeral;
this.port = seq.getAndIncrement();
this.serverAddress = ip + ":" + port;
registry = new CuratorRegistry();
registry.init();
setDaemon(true);
start();
}
@Override
public void run() {
while (!isExit) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
break;
}
}
}
public String getServerAddress() {
return serverAddress;
}
public int getPort() {
return port;
}
public void register() throws RegistryException {
if (isEphemeral) {
} else {
registry.registerPersistentNode(serviceName, group, serverAddress, weight);
}
System.out.println("register " + (isEphemeral ? "ephemeral " : "persistent ") + serverAddress);
}
public void unregister() throws RegistryException {
if (isEphemeral) {
} else {
registry.unregisterPersistentNode(serviceName, group, serverAddress);
}
System.out.println("unregister " + (isEphemeral ? "ephemeral " : "persistent ") + serverAddress);
}
public void normalExit() throws RegistryException {
unregister();
registry.close();
isExit = true;
System.out.println("normal exit");
}
public void abnormalExit() {
registry.close();
isExit = true;
System.out.println("abnormal exit");
}
}
}