/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.mobicents.media.server.impl.resource.prelay;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.concurrent.Semaphore;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
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.impl.clock.TimerImpl;
import org.mobicents.media.server.impl.dsp.DspFactory;
import org.mobicents.media.server.impl.dsp.audio.g711.alaw.DecoderFactory;
import org.mobicents.media.server.impl.dsp.audio.g711.alaw.EncoderFactory;
import org.mobicents.media.server.impl.resource.Proxy;
import org.mobicents.media.server.impl.resource.ProxySinkFactory;
import org.mobicents.media.server.impl.resource.ProxySourceFactory;
import org.mobicents.media.server.impl.resource.fft.AnalyzerFactory;
import org.mobicents.media.server.impl.resource.test.SineGeneratorFactory;
import org.mobicents.media.server.impl.resource.test.TransmissionTester2;
import org.mobicents.media.server.impl.rtp.RtpFactory;
import org.mobicents.media.server.impl.rtp.sdp.AVProfile;
import org.mobicents.media.server.resource.ChannelFactory;
import org.mobicents.media.server.resource.PipeFactory;
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;
import static org.junit.Assert.*;
/**
*
* @author kulikov
*/
public class TranscodingBridgeTest {
private int localPort1 = 9201;
private int localPort2 = 9202;
private final static int FREQ_ERROR = 5;
private int MAX_ERRORS = 3;
private final static int[] FREQ = new int[]{50, 250};
private Timer timer;
private EndpointImpl testerEndpoint, echoEndpoint;
private EndpointImpl packetRelayEnp;
private SineGeneratorFactory g1, g2;
private AnalyzerFactory a1, a2;
private ArrayList<double[]> s1, s2;
private BridgeFactory packetRelayFactory;
private ChannelFactory prChannelFactory;
private ChannelFactory channelFactory;
private Semaphore semaphore;
private boolean res;
private DspFactory dspFactory;
private RtpFactory rtpFactory1, rtpFactory2;
private EncoderFactory encoderFactory;
private DecoderFactory decoderFactory;
private ArrayList list;
private TransmissionTester2 tester;
private Proxy proxy;
private ConnectionFactory connectionFactory;
public TranscodingBridgeTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() throws Exception {
// creating timer
timer = new TimerImpl();
timer.start();
tester = new TransmissionTester2(timer);
HashMap<Integer, Format> rtpmap = new HashMap();
rtpmap.put(0, AVProfile.PCMA);
rtpFactory1 = new RtpFactory();
rtpFactory1.setBindAddress("localhost");
rtpFactory1.setLocalPort(localPort1);
rtpFactory1.setTimer(timer);
rtpFactory1.setFormatMap(rtpmap);
rtpFactory1.start();
Hashtable<String, RtpFactory> rtpFactories1 = new Hashtable();
rtpFactories1.put("audio", rtpFactory1);
// preparing g711: ALaw encoder, decoder
encoderFactory = new EncoderFactory();
decoderFactory = new DecoderFactory();
// group codecs into list
ArrayList codecs = new ArrayList();
codecs.add(encoderFactory);
codecs.add(decoderFactory);
// creating dsp factory with g711 encoder/decoder
dspFactory = new DspFactory();
dspFactory.setName("dsp");
dspFactory.setCodecFactories(codecs);
// creating component list
ArrayList components = new ArrayList();
components.add(dspFactory);
// define pipes
PipeFactory p1 = new PipeFactory();
p1.setInlet(null);
p1.setOutlet("dsp");
PipeFactory p2 = new PipeFactory();
p2.setInlet("dsp");
p2.setOutlet(null);
ArrayList pipes = new ArrayList();
pipes.add(p1);
pipes.add(p2);
// preparing channel factory
prChannelFactory = new ChannelFactory();
prChannelFactory.start();
prChannelFactory.setComponents(components);
prChannelFactory.setPipes(pipes);
ConnectionFactory prConnectionFactory = new ConnectionFactory();
prConnectionFactory.setRxChannelFactory(prChannelFactory);
prConnectionFactory.setTxChannelFactory(prChannelFactory);
// configuring Packet relay endpoint
packetRelayFactory = new BridgeFactory();
packetRelayFactory.setName("Packet-Relay");
packetRelayEnp = new EndpointImpl("/pr/test/cnf");
packetRelayEnp.setGroupFactory(packetRelayFactory);
packetRelayEnp.setTimer(timer);
packetRelayEnp.setConnectionFactory(prConnectionFactory);
packetRelayEnp.setRtpFactory(rtpFactories1);
// strating packet relay endpoint
packetRelayEnp.start();
// creating transparent channels
channelFactory = new ChannelFactory();
channelFactory.start();
connectionFactory = new ConnectionFactory();
connectionFactory.setRxChannelFactory(channelFactory);
connectionFactory.setTxChannelFactory(channelFactory);
setupTester();
setupEcho();
}
@After
public void tearDown() {
rtpFactory1.stop();
rtpFactory2.stop();
timer.stop();
}
private void setupTester() throws Exception {
tester = new TransmissionTester2(timer);
TestSourceFactory genFactory = new TestSourceFactory(tester);
TestSinkFactory detFactory = new TestSinkFactory(tester);
// configuring sender
testerEndpoint = new EndpointImpl("/pr/test/sender");
testerEndpoint.setTimer(timer);
testerEndpoint.setConnectionFactory(connectionFactory);
testerEndpoint.setSourceFactory(genFactory);
testerEndpoint.setSinkFactory(detFactory);
testerEndpoint.start();
}
private void setupEcho() throws Exception {
proxy = new Proxy("proxy");
proxy.setFormat(new Format[]{AVProfile.PCMA});
proxy.getInput().start();
proxy.getOutput().start();
ProxySourceFactory sourceFactory = new ProxySourceFactory(proxy);
ProxySinkFactory sinkFactory = new ProxySinkFactory(proxy);
HashMap<Integer, Format> rtpmap = new HashMap();
rtpmap.put(0, AVProfile.PCMA);
rtpFactory2 = new RtpFactory();
rtpFactory2.setBindAddress("localhost");
rtpFactory2.setLocalPort(localPort2);
rtpFactory2.setTimer(timer);
rtpFactory2.setFormatMap(rtpmap);
rtpFactory2.start();
Hashtable<String, RtpFactory> rtpFactories2 = new Hashtable();
rtpFactories2.put("audio", rtpFactory2);
echoEndpoint = new EndpointImpl("/pr/test/echo");
echoEndpoint.setTimer(timer);
echoEndpoint.setConnectionFactory(connectionFactory);
echoEndpoint.setSinkFactory(sinkFactory);
echoEndpoint.setSourceFactory(sourceFactory);
echoEndpoint.setRtpFactory(rtpFactories2);
echoEndpoint.start();
}
/**
* Test of getSink method, of class Bridge.
*/
// @Test
public void testSimpleTransmission() throws Exception {
Connection txConnection = testerEndpoint.createLocalConnection(ConnectionMode.SEND_RECV);
Connection rxConnection = echoEndpoint.createLocalConnection(ConnectionMode.SEND_RECV);
Connection rxC = packetRelayEnp.createLocalConnection(ConnectionMode.SEND_RECV);
Connection txC = packetRelayEnp.createLocalConnection(ConnectionMode.SEND_RECV);
rxC.setOtherParty(txConnection);
txC.setOtherParty(rxConnection);
tester.start();
echoEndpoint.deleteAllConnections();
testerEndpoint.deleteAllConnections();
packetRelayEnp.deleteAllConnections();
assertTrue(tester.getMessage(), tester.isPassed());
}
private void runRtpTransmission() throws Exception {
Connection txConnection = testerEndpoint.createLocalConnection(ConnectionMode.SEND_RECV);
Connection rxC = packetRelayEnp.createLocalConnection(ConnectionMode.SEND_RECV);
rxC.setOtherParty(txConnection);
Connection rxConnection = echoEndpoint.createConnection(ConnectionMode.SEND_RECV);
Connection txC = packetRelayEnp.createConnection(ConnectionMode.SEND_RECV);
txC.setRemoteDescriptor(rxConnection.getLocalDescriptor());
rxConnection.setRemoteDescriptor(txC.getLocalDescriptor());
tester.start();
echoEndpoint.deleteAllConnections();
testerEndpoint.deleteAllConnections();
packetRelayEnp.deleteAllConnections();
assertTrue(tester.getMessage(), tester.isPassed());
}
@Test
public void testRtpTransmission() throws Exception {
// for (int i = 0; i < 1; i++) {
// runRtpTransmission();
// }
}
private class TestSourceFactory implements ComponentFactory {
private TransmissionTester2 tester;
public TestSourceFactory(TransmissionTester2 tester) {
this.tester = tester;
}
public String getName() {
return tester.getGenerator().getName();
}
public Component newInstance(Endpoint endpoint) {
return tester.getGenerator();
}
}
private class TestSinkFactory implements ComponentFactory {
private TransmissionTester2 tester;
public TestSinkFactory(TransmissionTester2 tester) {
this.tester = tester;
}
public String getName() {
return tester.getDetector().getName();
}
public Component newInstance(Endpoint endpoint) {
return tester.getDetector();
}
}
}