package org.mobicents.tools.smpp.balancer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mobicents.tools.sip.balancer.BalancerRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cloudhopper.smpp.SmppSession;
import com.cloudhopper.smpp.impl.DefaultSmppClient;
import com.cloudhopper.smpp.impl.DefaultSmppServer;
import com.cloudhopper.smpp.type.SmppChannelException;
public class SpliterModeRebindTest {
private static final Logger logger = LoggerFactory.getLogger(SpliterModeRebindTest.class);
private static ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
private static ScheduledThreadPoolExecutor monitorExecutor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(1, new ThreadFactory() {
private AtomicInteger sequence = new AtomicInteger(0);
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("MonitorPool-" + sequence.getAndIncrement());
return t;
}
});
private static BalancerRunner balancer;
private static int clientNumbers = 1;
private static int serverNumbers = 3;
private static DefaultSmppServer[] serverArray;
private static DefaultSmppServerHandler [] serverHandlerArray = new DefaultSmppServerHandler[serverNumbers];
@BeforeClass
public static void initialization() {
boolean enableSslLbPort = false;
boolean terminateTLSTraffic = true;
//start lb
balancer = new BalancerRunner();
balancer.start(ConfigInit.getLbSpliterProperties(enableSslLbPort,terminateTLSTraffic));
// start servers
serverArray = new DefaultSmppServer[serverNumbers];
for (int i = 0; i < serverNumbers; i++) {
serverHandlerArray[i] = new DefaultSmppServerHandler();
serverArray[i] = new DefaultSmppServer(ConfigInit.getSmppServerConfiguration(i,false), serverHandlerArray[i], executor, monitorExecutor);
logger.info("Starting SMPP server...");
try {
serverArray[i].start();
} catch (SmppChannelException e) {
logger.info("SMPP server does not started");
e.printStackTrace();
}
logger.info("SMPP server started");
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//tests situation with dropped connection to server(rebind check)
@Test
public void testDisconnectServers() {
Locker locker = new Locker(clientNumbers);
// start client
new Load(locker, 1).start();
locker.waitForClients();
boolean isCorrectEnqLinkRequest = false;
for(DefaultSmppServerHandler handler : serverHandlerArray)
if(handler.getSmsNumber()==1)
isCorrectEnqLinkRequest = true;
assertTrue(isCorrectEnqLinkRequest);
}
@Test
public void testRebind() {
Locker locker = new Locker(clientNumbers);
// start client
new Load(locker, 2).start();
locker.waitForClients();
boolean isCorrectEnqLinkRequest = false;
for(DefaultSmppServerHandler handler : serverHandlerArray)
if(handler.getSmsNumber()==6)
isCorrectEnqLinkRequest = true;
assertTrue(isCorrectEnqLinkRequest);
}
@AfterClass
public static void finalization() {
for (int i = 0; i < serverNumbers; i++) {
logger.info("Stopping SMPP server " + i + " ...");
serverArray[i].destroy();
logger.info("SMPP server " + i + "stopped");
}
executor.shutdownNow();
monitorExecutor.shutdownNow();
balancer.stop();
logger.info("Done. Exiting");
}
private class Load extends Thread {
private ClientListener listener;
private int testNumber;
Load(ClientListener listener, int testNumber) {
this.listener = listener;
this.testNumber = testNumber;
}
public void run() {
DefaultSmppClient client = new DefaultSmppClient();
SmppSession session = null;
try {
if(testNumber == 1)
{
session = client.bind(ConfigInit.getSmppSessionConfiguration(1,false),new DefaultSmppClientHandler());
logger.info("stopping server 1");
serverArray[1].stop();
logger.info("stopping server 2");
serverArray[2].stop();
sleep(5000);
session.submit(ConfigInit.getSubmitSm(), 12000);
sleep(1000);
session.unbind(5000);
serverArray[1].start();
serverArray[2].start();
}
if(testNumber == 2)
{
session = client.bind(ConfigInit.getSmppSessionConfiguration(1,false),new DefaultSmppClientHandler());
serverArray[2].stop();
serverArray[2].start();
sleep(2000);
for(int j = 0; j < 6; j++)
{
session.submit(ConfigInit.getSubmitSm(), 12000);
}
sleep(1000);
session.unbind(5000);
}
} catch (Exception e) {
logger.error("", e);
}
if (session != null) {
logger.info("Cleaning up session...");
session.destroy();
}
logger.info("Shutting down client bootstrap and executors...");
client.destroy();
listener.clientCompleted();
}
}
private class Locker implements ClientListener {
private Semaphore clientsSemaphore;
private Locker(int clients) {
clientsSemaphore = new Semaphore(1 - clients);
}
@Override
public void clientCompleted() {
clientsSemaphore.release();
}
public void waitForClients() {
try {
clientsSemaphore.acquire();
} catch (InterruptedException ex) {
}
}
}
}