package org.mobicents.media.server.ctrl.mgcp.evt.dtmf;
import java.io.IOException;
import static org.junit.Assert.assertEquals;
import jain.protocol.ip.mgcp.message.parms.NotifiedEntity;
import jain.protocol.ip.mgcp.message.parms.RequestIdentifier;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mobicents.media.Buffer;
import org.mobicents.media.Component;
import org.mobicents.media.ComponentFactory;
import org.mobicents.media.Format;
import org.mobicents.media.server.ConnectionFactory;
import org.mobicents.media.server.EndpointImpl;
import org.mobicents.media.server.ctrl.mgcp.MgcpController;
import org.mobicents.media.server.ctrl.mgcp.Request;
import org.mobicents.media.server.impl.AbstractSink;
import org.mobicents.media.server.impl.clock.TimerImpl;
import org.mobicents.media.server.impl.resource.dtmf.Rfc2833GeneratorFactory;
import org.mobicents.media.server.impl.rtp.sdp.AVProfile;
import org.mobicents.media.server.resource.ChannelFactory;
import org.mobicents.media.server.spi.Connection;
import org.mobicents.media.server.spi.ConnectionMode;
import org.mobicents.media.server.spi.Endpoint;
import org.mobicents.media.server.spi.Timer;
/**
*
* @author amit bhayani
*
*/
public class Rfc2833DtmfGeneratorTest {
private Timer timer;
private EndpointImpl sender;
private EndpointImpl receiver;
private TestSinkFactory sinkFactory;
private Rfc2833GeneratorFactory rfc2833Factory;
private ChannelFactory channelFactory;
private Semaphore semaphore;
private MgcpController controller;
private int count;
private boolean dtmfReceived = false;
private boolean end = false;
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() throws Exception {
dtmfReceived = false;
end = false;
semaphore = new Semaphore(0);
timer = new TimerImpl();
rfc2833Factory = new Rfc2833GeneratorFactory();
rfc2833Factory.setName("RFC2833.Detector");
channelFactory = new ChannelFactory();
channelFactory.start();
sender = new EndpointImpl("test/announcement/sender");
sender.setTimer(timer);
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setRxChannelFactory(channelFactory);
connectionFactory.setTxChannelFactory(channelFactory);
sender.setSourceFactory(rfc2833Factory);
sender.setConnectionFactory(connectionFactory);
sender.start();
sinkFactory = new TestSinkFactory();
receiver = new EndpointImpl("test/announcement/receiver");
receiver.setTimer(timer);
receiver.setSinkFactory(sinkFactory);
receiver.setConnectionFactory(connectionFactory);
receiver.start();
}
@Test
public void testSignal() throws Exception {
Connection rxConnection = receiver.createLocalConnection(ConnectionMode.RECV_ONLY);
Connection txConnection = sender.createLocalConnection(ConnectionMode.SEND_ONLY);
txConnection.setOtherParty(rxConnection);
RequestIdentifier id = new RequestIdentifier("1");
NotifiedEntity ne = new NotifiedEntity("localhost");
DtmfGeneratorFactory factory = new DtmfGeneratorFactory();
factory.setResourceName("RFC2833.Detector");
factory.setDigit("6");
DtmfGenerator signal = (DtmfGenerator) factory.getInstance(controller, "");
Request request = new Request(controller, id, null, sender, ne);
signal.doVerify(sender);
signal.start(request);
System.out.println("Started");
semaphore.tryAcquire(5, TimeUnit.SECONDS);
// assertEquals(6, count);
assertEquals(true, dtmfReceived);
receiver.deleteConnection(rxConnection.getId());
sender.deleteConnection(txConnection.getId());
}
@After
public void tearDown() {
}
private class TestSinkFactory implements ComponentFactory {
public Component newInstance(Endpoint endpoint) {
return new TestSink("test-sink");
}
}
private class TestSink extends AbstractSink {
public TestSink(String name) {
super(name);
}
public Format[] getFormats() {
return new Format[] { AVProfile.DTMF };
}
public boolean isAcceptable(Format format) {
return true;
}
public void receive(Buffer buffer) {
count++;
System.out.println("======== Recv");
byte[] data = (byte[]) buffer.getData();
String digit = "6";
// String digit = DtmfDetector.TONE[data[0]];
if ("6".equals(digit)) {
dtmfReceived = true;
}
end = (data[1] & 0x80) != 0;
}
@Override
public void onMediaTransfer(Buffer buffer) throws IOException {
throw new UnsupportedOperationException("Not supported yet.");
}
}
}