package org.mobicents.media.server.ctrl.mgcp.test.ann;
import jain.protocol.ip.mgcp.JainMgcpCommandEvent;
import jain.protocol.ip.mgcp.JainMgcpEvent;
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.NotifyResponse;
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 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.io.File;
import java.net.URL;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.mobicents.jain.protocol.ip.mgcp.pkg.AUMgcpEvent;
import org.mobicents.jain.protocol.ip.mgcp.pkg.AUPackage;
import org.mobicents.media.server.ctrl.mgcp.test.Connection;
import org.mobicents.media.server.ctrl.mgcp.test.MgcpMicrocontainerTest;
/**
*
* @author amit bhayani
*
*/
public class AnnTestCase extends MgcpMicrocontainerTest {
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;
public AnnTestCase(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.RecvOnly, txConnection.getLocalSdp());
modifyConnection(txConnection, rxConnection.getLocalSdp());
playbackID = new RequestIdentifier("1");
recordingID = new RequestIdentifier("2");
}
@Override
public void tearDown() throws Exception {
deleteConnectionConnection(rxConnection);
deleteConnectionConnection(txConnection);
Thread.sleep(2000);
super.tearDown();
}
private void startPlayer(String url) throws Exception {
EndpointIdentifier endpointID = new EndpointIdentifier(AAP, "127.0.0.1");
NotificationRequest rqnt = new NotificationRequest(this, txConnection.getEndpoint(), playbackID);
EventName[] signalRequests = {new EventName(PackageName.Announcement, MgcpEvent.ann.withParm(url), null)};
rqnt.setSignalRequests(signalRequests);
RequestedAction[] actions = new RequestedAction[]{RequestedAction.NotifyImmediately};
RequestedEvent[] requestedEvents = {new RequestedEvent(new EventName(PackageName.Announcement,
MgcpEvent.oc, null), actions)
};
rqnt.setRequestedEvents(requestedEvents);
NotifiedEntity notifiedEntity = new NotifiedEntity(caIPAddress.getHostName(), caIPAddress.getHostAddress(), caStack.getPort());
rqnt.setNotifiedEntity(notifiedEntity);
rqnt.setTransactionHandle(caProvider.getUniqueTransactionHandler());
response = null;
caProvider.sendMgcpEvents(new JainMgcpCommandEvent[]{rqnt});
semaphore.tryAcquire(5, TimeUnit.SECONDS);
if (response == null) {
throw new Exception("Time out");
}
if (response.getReturnCode().getValue() != ReturnCode.TRANSACTION_EXECUTED_NORMALLY) {
throw new Exception("Could not start player:" + response.getReturnCode().getComment());
}
}
private void startRecording(String url) throws Exception {
EndpointIdentifier endpointID = new EndpointIdentifier(IVR, "127.0.0.1");
NotificationRequest rqnt = new NotificationRequest(this, rxConnection.getEndpoint(), recordingID);
EventName[] signalRequests = {new EventName(AUPackage.AU, AUMgcpEvent.aupr.withParm(url), null)};
rqnt.setSignalRequests(signalRequests);
NotifiedEntity notifiedEntity = new NotifiedEntity(caIPAddress.getHostName(), caIPAddress.getHostAddress(), caStack.getPort());
rqnt.setNotifiedEntity(notifiedEntity);
rqnt.setTransactionHandle(caProvider.getUniqueTransactionHandler());
response = null;
caProvider.sendMgcpEvents(new JainMgcpCommandEvent[]{rqnt});
semaphore.tryAcquire(5, TimeUnit.SECONDS);
if (response == null) {
throw new Exception("Time out");
}
if (response.getReturnCode().getValue() != ReturnCode.TRANSACTION_EXECUTED_NORMALLY) {
throw new Exception("Could not start player:" + response.getReturnCode().getComment());
}
}
@Test
public void testSimpleTransmission() throws Exception {
Thread.currentThread().sleep(1000);
url = AnnTestCase.class.getClassLoader().getResource("org/mobicents/media/server/ctrl/mgcp/test/ann/8kulaw.wav");
String path = url.getPath();
path = path.substring(0, path.lastIndexOf("/"));
startRecording(path + "/test-record.wav");
Thread.currentThread().sleep(1000);
startPlayer("file:" + url.getPath());
semaphore.tryAcquire(15, TimeUnit.SECONDS);
assertEquals(true, oc);
File file = new File(path + "/test-record.wav");
assertEquals(true, file.exists());
file.delete();
//netx run on event
playbackID = new RequestIdentifier("10");
recordingID = new RequestIdentifier("20");
response = null;
oc = false;
System.out.println(">>>>> Staring recording 2");
startRecording(path + "/test-record.wav");
System.out.println(">>>>> SLIPPING");
Thread.currentThread().sleep(1000);
System.out.println(">>>>> Staring player 2");
startPlayer("file:" + url.getPath());
semaphore.tryAcquire(15, TimeUnit.SECONDS);
assertEquals(true, oc);
file = new File(path + "/test-record.wav");
assertEquals(true, file.exists());
}
//@Override
public void processMgcpCommandEvent(JainMgcpCommandEvent event) {
if (event.getObjectIdentifier() == Constants.CMD_NOTIFY) {
oc = true;
NotifyResponse res = new NotifyResponse(this, ReturnCode.Transaction_Executed_Normally);
res.setTransactionHandle(event.getTransactionHandle());
caProvider.sendMgcpEvents(new JainMgcpEvent[]{res});
System.out.println("RELEASING SEMAPHORE");
semaphore.release();
}
}
@Override
public void processMgcpResponseEvent(JainMgcpResponseEvent event) {
super.processMgcpResponseEvent(event);
response = event;
// semaphore.release();
}
}