package org.mobicents.media.server.ctrl.mgcp.test.dtmf; import jain.protocol.ip.mgcp.JainMgcpCommandEvent; import jain.protocol.ip.mgcp.JainMgcpResponseEvent; import jain.protocol.ip.mgcp.message.Constants; import jain.protocol.ip.mgcp.message.NotificationRequest; import jain.protocol.ip.mgcp.message.Notify; import jain.protocol.ip.mgcp.message.parms.ConnectionMode; import jain.protocol.ip.mgcp.message.parms.EndpointIdentifier; import jain.protocol.ip.mgcp.message.parms.EventName; import jain.protocol.ip.mgcp.message.parms.NotifiedEntity; import jain.protocol.ip.mgcp.message.parms.RequestIdentifier; import jain.protocol.ip.mgcp.message.parms.RequestedAction; import java.net.URL; import java.util.concurrent.Semaphore; import jain.protocol.ip.mgcp.message.parms.RequestedEvent; import jain.protocol.ip.mgcp.message.parms.ReturnCode; import jain.protocol.ip.mgcp.pkg.MgcpEvent; import jain.protocol.ip.mgcp.pkg.PackageName; import java.util.concurrent.TimeUnit; import org.junit.Test; import org.mobicents.media.server.ctrl.mgcp.test.Connection; import org.mobicents.media.server.ctrl.mgcp.test.MgcpMicrocontainerTest; import org.mobicents.mgcp.stack.JainMgcpExtendedListener; /** * * @author amit bhayani * */ public class DtmfDetectionTestCase extends MgcpMicrocontainerTest implements JainMgcpExtendedListener { private final static String AAP = "/mobicents/media/aap/$"; private final static String IVR = "/mobicents/media/IVR/$"; private Connection rxConnection; private Connection txConnection; private URL url = null; private Semaphore semaphore; private RequestIdentifier playbackID; private RequestIdentifier recordingID; private JainMgcpResponseEvent response; private boolean oc = false; private EventName[] events; public DtmfDetectionTestCase(String name) { super(name); } @Override protected void setUp() throws Exception { super.setUp(); semaphore = new Semaphore(0); txConnection = createConnection(AAP, ConnectionMode.SendOnly, null); rxConnection = createConnection(IVR, ConnectionMode.SendRecv, txConnection.getLocalSdp()); modifyConnection(txConnection, rxConnection.getLocalSdp()); playbackID = new RequestIdentifier("1"); recordingID = new RequestIdentifier("2"); Thread.currentThread().sleep(2000); } private void requestDtmfDet(MgcpEvent digit) { NotificationRequest notificationRequest = new NotificationRequest(this, rxConnection.getEndpoint(), recordingID); RequestedAction[] actions = new RequestedAction[]{RequestedAction.NotifyImmediately}; RequestedEvent[] requestedEvents = {new RequestedEvent(new EventName(PackageName.Dtmf, digit, rxConnection.getId()), actions) }; notificationRequest.setRequestedEvents(requestedEvents); NotifiedEntity notifiedEntity = new NotifiedEntity(caIPAddress.getHostName(), caIPAddress.getHostAddress(), caStack.getPort()); notificationRequest.setNotifiedEntity(notifiedEntity); notificationRequest.setTransactionHandle(caProvider.getUniqueTransactionHandler()); super.caProvider.sendMgcpEvents(new JainMgcpCommandEvent[]{notificationRequest}); } private void requestDtmfGen(MgcpEvent digit) { NotificationRequest notificationRequest = new NotificationRequest(this, txConnection.getEndpoint(), playbackID); EventName[] signalRequests = {new EventName(PackageName.Dtmf, digit, txConnection.getId())}; notificationRequest.setSignalRequests(signalRequests); NotifiedEntity notifiedEntity = new NotifiedEntity(caIPAddress.getHostName(), caIPAddress.getHostAddress(), caStack.getPort()); notificationRequest.setNotifiedEntity(notifiedEntity); notificationRequest.setTransactionHandle(caProvider.getUniqueTransactionHandler()); caProvider.sendMgcpEvents(new JainMgcpCommandEvent[]{notificationRequest}); } @Test public void testDtmf() throws Exception { this.requestDtmfDet(MgcpEvent.dtmf0); Thread.currentThread().sleep(1000); this.requestDtmfGen(MgcpEvent.dtmf0); oc = false; semaphore.tryAcquire(15, TimeUnit.SECONDS); assertEquals(true, checkEvent(MgcpEvent.dtmf0)); Thread.currentThread().sleep(2000); } @Override public void tearDown() throws Exception { deleteConnectionConnection(rxConnection); deleteConnectionConnection(txConnection); Thread.sleep(2000); super.tearDown(); } private boolean checkEvent(MgcpEvent exp) { if (events == null) { return false; } if (events.length != 1) { return false; } return events[0].getEventIdentifier().getName().equals(exp.getName()); } public void processMgcpCommandEvent(JainMgcpCommandEvent event) { System.out.println("******** CMD ***********"); int msg = event.getObjectIdentifier(); if (msg != Constants.CMD_NOTIFY) { return; } Notify ntfy = (Notify) event; events = ntfy.getObservedEvents(); if (!oc) { oc = true; semaphore.release(); } } @Override public void processMgcpResponseEvent(JainMgcpResponseEvent event) { super.processMgcpResponseEvent(event); response = event; } }