/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.mobicents.media.server; import java.net.URL; import java.util.HashMap; import static org.junit.Assert.assertEquals; import java.util.Hashtable; 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.format.AudioFormat; import org.mobicents.media.server.impl.AbstractSink; import org.mobicents.media.server.impl.clock.TimerImpl; import org.mobicents.media.server.impl.resource.audio.AudioPlayerFactory; 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.spi.Connection; import org.mobicents.media.server.spi.ConnectionMode; import org.mobicents.media.server.spi.Endpoint; import org.mobicents.media.server.spi.NotificationListener; import org.mobicents.media.server.spi.Timer; import org.mobicents.media.server.spi.events.NotifyEvent; import org.mobicents.media.server.spi.resource.AudioPlayer; /** * * @author kulikov * @author baranowb */ public class RtpConnectionDefaultFormatsTest { private Timer timer; private int localPort1 = 9201; private int localPort2 = 9202; private EndpointImpl sender; private EndpointImpl receiver; private AudioPlayerFactory playerFactory; private TestSinkFactory sinkFactory; private ChannelFactory channelFactory; private RtpFactory rtpFactory1, rtpFactory2; private Semaphore semaphore; private int count; @BeforeClass public static void setUpClass() throws Exception { } @AfterClass public static void tearDownClass() throws Exception { } @Before public void setUp() throws Exception { semaphore = new Semaphore(0); timer = new TimerImpl(); timer.start(); HashMap<Integer, Format> rtpmap = new HashMap(); rtpmap.put(0, new AudioFormat(AudioFormat.ALAW, 8000, 8, 1)); rtpmap.put(8, new AudioFormat(AudioFormat.ULAW, 8000, 8, 1)); rtpFactory1 = new RtpFactory(); rtpFactory1.setBindAddress("localhost"); rtpFactory1.setLocalPort(localPort1); rtpFactory1.setTimer(timer); rtpFactory1.setFormatMap(rtpmap); rtpFactory1.start(); rtpFactory2 = new RtpFactory(); rtpFactory2.setBindAddress("localhost"); rtpFactory2.setLocalPort(localPort2); rtpFactory2.setTimer(timer); rtpFactory2.setFormatMap(rtpmap); rtpFactory2.start(); Hashtable<String, RtpFactory> rtpFactories1 = new Hashtable(); rtpFactories1.put("audio", rtpFactory1); Hashtable<String, RtpFactory> rtpFactories2 = new Hashtable(); rtpFactories2.put("audio", rtpFactory2); playerFactory = new AudioPlayerFactory(); playerFactory.setName("audio.player"); sinkFactory = new TestSinkFactory(); channelFactory = new ChannelFactory(); channelFactory.start(); ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setRxChannelFactory(channelFactory); connectionFactory.setTxChannelFactory(channelFactory); sender = new EndpointImpl("test/announcement/sender"); sender.setTimer(timer); sender.setRtpFactory(rtpFactories1); sender.setSourceFactory(playerFactory); sender.setConnectionFactory(connectionFactory); sender.start(); receiver = new EndpointImpl("test/announcement/receiver"); receiver.setTimer(timer); receiver.setRtpFactory(rtpFactories2); receiver.setSinkFactory(sinkFactory); receiver.setConnectionFactory(connectionFactory); receiver.start(); } @After public void tearDown() { timer.stop(); } /** * Test of getLocalName method, of class EndpointImpl. */ @Test public void testTransmission() throws Exception { Connection rxConnection = receiver.createConnection(ConnectionMode.RECV_ONLY); Connection txConnection = sender.createConnection(ConnectionMode.SEND_ONLY); txConnection.setRemoteDescriptor(rxConnection.getLocalDescriptor()); rxConnection.setRemoteDescriptor(txConnection.getLocalDescriptor()); Component c = sender.getComponent("audio.player"); AudioPlayer player = (AudioPlayer)c; URL url = RtpConnectionDefaultFormatsTest.class.getClassLoader().getResource( "org/mobicents/media/server/impl/addf8-Alaw-GW.wav"); player.setURL(url.toExternalForm()); player.addListener(new PlayerListener()); player.start(); semaphore.tryAcquire(10, TimeUnit.SECONDS); boolean res = Math.abs(150-count) < 10; assertEquals(true, res); assertEquals(true, receiver.isInUse()); assertEquals(true, sender.isInUse()); receiver.deleteConnection(rxConnection.getId()); sender.deleteConnection(txConnection.getId()); assertEquals(false, receiver.isInUse()); assertEquals(false, sender.isInUse()); } private class PlayerListener implements NotificationListener { public void update(NotifyEvent event) { if (event.getEventID() == NotifyEvent.COMPLETED) { semaphore.release(); } } } private class TestSinkFactory implements ComponentFactory { public Component newInstance(Endpoint endpoint) { return new TestSink("Tester[detector]"); } } private class TestSink extends AbstractSink { public TestSink(String name) { super(name); } public Format[] getFormats() { return new Format[] {AVProfile.PCMA}; } public boolean isAcceptable(Format format) { return true; } public void receive(Buffer buffer) { count++; } @Override public void onMediaTransfer(Buffer buffer) { throw new UnsupportedOperationException("Not supported yet."); } } }