package org.mobicents.qa.performance.jainsip; import java.text.ParseException; import java.util.Properties; import java.util.Timer; import java.util.TimerTask; import javax.sip.Dialog; import javax.sip.DialogTerminatedEvent; import javax.sip.IOExceptionEvent; import javax.sip.ListeningPoint; import javax.sip.PeerUnavailableException; import javax.sip.RequestEvent; import javax.sip.ResponseEvent; import javax.sip.ServerTransaction; import javax.sip.SipException; import javax.sip.SipFactory; import javax.sip.SipListener; import javax.sip.SipProvider; import javax.sip.SipStack; import javax.sip.TimeoutEvent; import javax.sip.TransactionDoesNotExistException; import javax.sip.TransactionTerminatedEvent; import javax.sip.TransactionUnavailableException; import javax.sip.address.AddressFactory; import javax.sip.address.SipURI; import javax.sip.header.HeaderFactory; import javax.sip.message.MessageFactory; import javax.sip.message.Request; import javax.sip.message.Response; import org.mobicents.qa.performance.jainsip.governor.*; import org.mobicents.qa.performance.jainsip.inspector.TestInspector; import org.mobicents.qa.performance.jainsip.inspector.TestProbe; import org.mobicents.qa.performance.jainsip.util.SimpleCallSetupTestFileUtils; import org.mobicents.qa.performance.jainsip.util.SippController; public class InstrumentedSimpleCallSetupTest implements SipListener { private TestProbe probe; private AddressFactory addressFactory; private MessageFactory messageFactory; private HeaderFactory headerFactory; private SipStack sipStack; private SipProvider sipProvider; private String transport = "udp"; private boolean sendBye; private Timer myTimer; private int timeout; public InstrumentedSimpleCallSetupTest(String ip, String port, boolean debug, boolean sendBye, TestProbe probe) { SipFactory sipFactory = SipFactory.getInstance(); sipFactory.setPathName("gov.nist"); Properties properties = new Properties(); properties.setProperty("javax.sip.STACK_NAME", "mobicents-standalone-test"); properties.setProperty("gov.nist.javax.sip.MAX_SERVER_TRANSACTIONS", "500000"); properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "debuglog.txt"); properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "stack_log.txt"); properties.setProperty("javax.sip.AUTOMATIC_DIALOG_SUPPORT", "false"); properties.setProperty("gov.nist.javax.sip.THREAD_POOL_SIZE", "64"); properties.setProperty("gov.nist.javax.sip.REENTRANT_LISTENER", "true"); properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", debug ? "32" : "0"); try { sipStack = sipFactory.createSipStack(properties); System.out.println((new StringBuilder("\n")).append("SipStack ").append(sipStack).append(" created.\n").toString()); } catch (PeerUnavailableException e) { e.printStackTrace(); System.err.println(e.getMessage()); throw new RuntimeException("Stack failed to initialize"); } try { headerFactory = sipFactory.createHeaderFactory(); addressFactory = sipFactory.createAddressFactory(); messageFactory = sipFactory.createMessageFactory(); ListeningPoint listeningPoint = sipStack.createListeningPoint(ip, Integer.parseInt(port), transport); sipProvider = sipStack.createSipProvider(listeningPoint); sipProvider.addSipListener(this); this.sendBye = sendBye; this.probe = probe; if (sendBye) { this.myTimer = new Timer(); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } protected Response createResponse(Request request, int responseType) throws ParseException { SipURI sipUri = (SipURI) request.getRequestURI(); SipURI sipAddress = addressFactory.createSipURI(sipUri.getUser(), sipUri.getHost()); Response response = messageFactory.createResponse(responseType, request); response.addHeader(headerFactory.createContactHeader(addressFactory.createAddress(sipAddress))); return response; } public void processRequest(RequestEvent requestEvent) { String method = requestEvent.getRequest().getMethod(); if (Request.INVITE.equalsIgnoreCase(method)) { try { probe.dialogCreated(); ServerTransaction serverTransaction = sipProvider.getNewServerTransaction(requestEvent.getRequest()); Dialog dialog = sipProvider.getNewDialog(serverTransaction); serverTransaction.sendResponse(createResponse(requestEvent.getRequest(), Response.OK)); if (sendBye) { myTimer.schedule(new ByeTimerTask(dialog, sipProvider), timeout * 1000); } } catch (Exception e) { probe.dialogTerminatedUnexpectedly(); e.printStackTrace(); } } else if (Request.BYE.equalsIgnoreCase(method)) { try { probe.dialogTerminated(); requestEvent.getServerTransaction().sendResponse(createResponse(requestEvent.getRequest(), Response.OK)); } catch (Exception e) { probe.dialogTerminatedUnexpectedly(); e.printStackTrace(); } } } public void processResponse(ResponseEvent responseevent) { } public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) { } public void processIOException(IOExceptionEvent exceptionEvent) { probe.dialogTerminatedUnexpectedly(); } public void processTimeout(TimeoutEvent timeoutEvent) { probe.dialogTerminatedUnexpectedly(); } public void processTransactionTerminated(TransactionTerminatedEvent transactionterminatedevent) { } public static void main(String args[]) { String ip = "127.0.0.1"; String port = "5060"; // String timeout = "60"; boolean debug = false; boolean sendBye = false; for (int i = 0; i < args.length; i++) { if ("-i".equals(args[i])) { ip = args[++i]; System.out.println("IP flag; " + ip); } else if ("-p".equals(args[i])) { port = args[++i]; System.out.println("Port flag: " + port); } else if ("-debug".equals(args[i])) { debug = true; System.out.println("Debug flag"); } else if ("-sendbye".equals(args[i])) { sendBye = true; System.out.println("Send BYE flag"); // } else if ("-t".equals(args[i])) { // timeout = args[++i]; // System.out.println("Timeout flag: " + timeout); } else if ("--help".equals(args[i])) { System.out.println("Simple Call Setup Test. Available options: "); System.out.println("-i ip --- interface to bind (default 127.0.0.1)"); System.out.println("-p port --- port to bind (default 5060)"); System.out.println("-d --- produces debug log (default false)"); System.out.println("-sendbye --- application sends bye instead of UA (default false) "); // System.out.println("-t timeout --- timeout when using -sendbye option (default false)"); System.out.println("--help --- prints this help and exits"); return; } } TestInspector inspector = new TestInspector(); new InstrumentedSimpleCallSetupTest(ip, port, debug, sendBye, inspector); String control = "" + ((int) Math.round(Math.random() * 50000) + 10000); System.out.println("Random control port for sipp: " + control + "\n"); if (sendBye) { SimpleCallSetupTestFileUtils.extract("uac-sendbye.xml", "."); SimpleCallSetupTestFileUtils.writeSippStartFile("test.sh", ".", "uac-sendbye.xml", ip, port, control); } else { SimpleCallSetupTestFileUtils.extract("uac.xml", "."); SimpleCallSetupTestFileUtils.writeSippStartFile("test.sh", ".", "uac.xml", ip, port, control); } SimpleCallSetupTestFileUtils.extract("download-and-compile-sipp.sh", "."); SimpleCallSetupTestFileUtils.executize("."); new NoRateGovernor(inspector, new SippController(ip, control)); // new FixedRateGovernor(inspector, new SippController(ip, control), 100); // new LinearRateGovernor(inspector, new SippController(ip, control), 10, 1); // new ExponentialLinearRateGovernor(inspector, new SippController(ip, control), 4, 1.2, 1); // new MyFirstHeuristicsGovernor(inspector, new SippController(ip, control)); } private class ByeTimerTask extends TimerTask { private final Dialog dialog; private final SipProvider provider; public void run() { try { if (dialog != null) { dialog.sendRequest(provider.getNewClientTransaction(dialog.createRequest(Request.BYE))); } else { System.out.println("Avoding sending BYE on null dialog"); } } catch (TransactionDoesNotExistException e) { e.printStackTrace(); } catch (TransactionUnavailableException e) { e.printStackTrace(); } catch (SipException e) { e.printStackTrace(); } } public ByeTimerTask(Dialog dialog, SipProvider provider) { super(); this.dialog = dialog; this.provider = provider; } } }