/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.mobicents.media.server.ctrl.mgcp.evt.ann;
import jain.protocol.ip.mgcp.message.parms.NotifiedEntity;
import jain.protocol.ip.mgcp.message.parms.RequestIdentifier;
import java.io.IOException;
import java.net.URL;
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 static org.junit.Assert.*;
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.audio.AudioPlayerFactory;
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 kulikov
*/
public class PlayAnnouncementTest {
private Timer timer;
private EndpointImpl sender;
private EndpointImpl receiver;
private AudioPlayerFactory playerFactory;
private TestSinkFactory sinkFactory;
private ChannelFactory channelFactory;
private Semaphore semaphore;
private boolean res;
private int pcmaCount;
private MgcpController controller;
public PlayAnnouncementTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() throws Exception {
semaphore = new Semaphore(0);
res = false;
timer = new TimerImpl();
timer.start();
playerFactory = new AudioPlayerFactory();
playerFactory.setName("audio.player");
sinkFactory = new TestSinkFactory();
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(playerFactory);
sender.setConnectionFactory(connectionFactory);
sender.start();
receiver = new EndpointImpl("test/announcement/receiver");
receiver.setTimer(timer);
receiver.setSinkFactory(sinkFactory);
receiver.setConnectionFactory(connectionFactory);
receiver.start();
}
@After
public void tearDown() {
timer.stop();
}
/**
* Test of doVerify method, of class PlayAnnouncement.
*/
@Test
public void testSignal() throws Exception {
System.out.println("======1");
Connection rxConnection = receiver.createLocalConnection(ConnectionMode.RECV_ONLY);
System.out.println("======2");
Connection txConnection = sender.createLocalConnection(ConnectionMode.SEND_ONLY);
txConnection.setOtherParty(rxConnection);
URL url = PlayAnnouncementTest.class.getClassLoader().getResource("addf8-Alaw-GW.wav");
String s = url.toExternalForm();
RequestIdentifier id = new RequestIdentifier("1");
NotifiedEntity ne = new NotifiedEntity("localhost");
PlayAnnouncementFactory factory = new PlayAnnouncementFactory();
factory.setResourceName("audio.player");
PlayAnnouncement signal = (PlayAnnouncement) factory.getInstance(controller, s);
Request request = new Request(controller, id, null, sender, ne);
signal.doVerify(sender);
signal.start(request);
System.out.println("Started");
semaphore.tryAcquire(10, TimeUnit.SECONDS);
System.out.println(pcmaCount);
assertTrue("The amount of packets dos not match", Math.abs(150 - pcmaCount) < 20);
receiver.deleteConnection(rxConnection.getId());
sender.deleteConnection(txConnection.getId());
}
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.PCMA };
}
public boolean isAcceptable(Format format) {
return true;
}
public void receive(Buffer buffer) {
if (buffer.getFormat().equals(Endpoint.PCMA)) {
pcmaCount++;
}
}
@Override
public void onMediaTransfer(Buffer buffer) throws IOException {
throw new UnsupportedOperationException("Not supported yet.");
}
}
}