/* * TeleStax, Open Source Cloud Communications * Copyright 2012, Telestax Inc and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.mobicents.protocols.ss7.m3ua.impl; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import io.netty.buffer.ByteBufAllocator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import javolution.util.FastMap; import org.mobicents.protocols.api.Association; import org.mobicents.protocols.api.AssociationListener; import org.mobicents.protocols.api.AssociationType; import org.mobicents.protocols.api.CongestionListener; import org.mobicents.protocols.api.IpChannelType; import org.mobicents.protocols.api.Management; import org.mobicents.protocols.api.ManagementEventListener; import org.mobicents.protocols.api.PayloadData; import org.mobicents.protocols.api.Server; import org.mobicents.protocols.api.ServerListener; import org.mobicents.protocols.ss7.m3ua.ExchangeType; import org.mobicents.protocols.ss7.m3ua.Functionality; import org.mobicents.protocols.ss7.m3ua.IPSPType; import org.mobicents.protocols.ss7.m3ua.impl.fsm.FSM; import org.mobicents.protocols.ss7.m3ua.impl.message.M3UAMessageImpl; import org.mobicents.protocols.ss7.m3ua.impl.message.MessageFactoryImpl; import org.mobicents.protocols.ss7.m3ua.impl.message.asptm.ASPActiveImpl; import org.mobicents.protocols.ss7.m3ua.impl.message.asptm.ASPInactiveImpl; import org.mobicents.protocols.ss7.m3ua.impl.message.transfer.PayloadDataImpl; import org.mobicents.protocols.ss7.m3ua.impl.parameter.ParameterFactoryImpl; import org.mobicents.protocols.ss7.m3ua.impl.parameter.ProtocolDataImpl; import org.mobicents.protocols.ss7.m3ua.message.M3UAMessage; import org.mobicents.protocols.ss7.m3ua.message.MessageClass; import org.mobicents.protocols.ss7.m3ua.message.MessageType; import org.mobicents.protocols.ss7.m3ua.message.mgmt.Notify; import org.mobicents.protocols.ss7.m3ua.parameter.ErrorCode; import org.mobicents.protocols.ss7.m3ua.parameter.RoutingContext; import org.mobicents.protocols.ss7.m3ua.parameter.Status; import org.mobicents.protocols.ss7.m3ua.parameter.TrafficModeType; import org.mobicents.protocols.ss7.mtp.Mtp3EndCongestionPrimitive; import org.mobicents.protocols.ss7.mtp.Mtp3PausePrimitive; import org.mobicents.protocols.ss7.mtp.Mtp3Primitive; import org.mobicents.protocols.ss7.mtp.Mtp3ResumePrimitive; import org.mobicents.protocols.ss7.mtp.Mtp3StatusPrimitive; import org.mobicents.protocols.ss7.mtp.Mtp3TransferPrimitive; import org.mobicents.protocols.ss7.mtp.Mtp3UserPartListener; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * Test for FSM of IPSP acting as Server * * @author abhayani * */ public class IPSPServerFSMTest { private ParameterFactoryImpl parmFactory = new ParameterFactoryImpl(); private MessageFactoryImpl messageFactory = new MessageFactoryImpl(); private M3UAManagementImpl serverM3UAMgmt = null; private Semaphore semaphore = null; private Mtp3UserPartListenerimpl mtp3UserPartListener = null; private NettyTransportManagement transportManagement = null; public IPSPServerFSMTest() { } @BeforeClass public static void setUpClass() throws Exception { } @AfterClass public static void tearDownClass() throws Exception { } @BeforeMethod public void setUp() throws Exception { semaphore = new Semaphore(0); this.transportManagement = new NettyTransportManagement(); this.serverM3UAMgmt = new M3UAManagementImpl("IPSPServerFSMTest", null); this.serverM3UAMgmt.setTransportManagement(this.transportManagement); this.mtp3UserPartListener = new Mtp3UserPartListenerimpl(); this.serverM3UAMgmt.addMtp3UserPartListener(this.mtp3UserPartListener); this.serverM3UAMgmt.start(); } @AfterMethod public void tearDown() throws Exception { serverM3UAMgmt.removeAllResourses(); serverM3UAMgmt.stop(); } private AspState getAspState(FSM fsm) { return AspState.getState(fsm.getState().getName()); } private AsState getAsState(FSM fsm) { return AsState.getState(fsm.getState().getName()); } @Test public void testSingleAspInAsWithRC() throws Exception { // 5.1.1. Single ASP in an Application Server ("1+0" sparing), TestAssociation testAssociation = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0, "testAssoc1"); RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 }); // As remAs = sgw.createAppServer("testas", rc, rKey, trModType); AsImpl remAs = (AsImpl) serverM3UAMgmt.createAs("testas", Functionality.IPSP, ExchangeType.SE, IPSPType.SERVER, rc, null, 1, null); FSM asLocalFSM = remAs.getLocalFSM(); AspFactoryImpl aspFactoryImpl = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp", "testAssoc1", false); AspImpl remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp"); // Create Route this.serverM3UAMgmt.addRoute(2, -1, -1, "testas"); FSM aspPeerFSM = remAsp.getPeerFSM(); // Check for Communication UP testAssociation.signalCommUp(); assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM)); // Peer sends ASP_UP M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP); aspFactoryImpl.read(message); assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1)); // also the AS should be INACTIVE now an no Notify should have been sent assertEquals(AsState.INACTIVE, this.getAsState(asLocalFSM)); // Peer sends ASP_ACTIVE message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE); ((ASPActiveImpl) message).setRoutingContext(rc); aspFactoryImpl.read(message); assertEquals(AspState.ACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1)); // also the AS should be ACTIVE now assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM)); // Check if MTP3 RESUME received // lets wait for 2second to receive the MTP3 primitive before giving up semaphore.tryAcquire(2000, TimeUnit.MILLISECONDS); Mtp3Primitive mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll(); assertNotNull(mtp3Primitive); assertEquals(Mtp3Primitive.RESUME, mtp3Primitive.getType()); assertEquals(2, mtp3Primitive.getAffectedDpc()); // No more MTP3 Primitive or message assertNull(this.mtp3UserPartListener.rxMtp3PrimitivePoll()); assertNull(this.mtp3UserPartListener.rxMtp3TransferPrimitivePoll()); // Since we didn't set the Traffic Mode while creating AS, it should now // be set to loadshare as default assertEquals(TrafficModeType.Loadshare, remAs.getTrafficModeType().getMode()); // Check for ASP_INACTIVE message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE); ((ASPInactiveImpl) message).setRoutingContext(rc); aspFactoryImpl.read(message); assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1, -1)); // also the AS should be PENDING now assertEquals(AsState.PENDING, this.getAsState(asLocalFSM)); // Check for ASP_DOWN message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN); aspFactoryImpl.read(message); assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK, -1, -1)); // also the AS is PENDING assertEquals(AsState.PENDING, this.getAsState(asLocalFSM)); // lets wait for 3 seconds to receive the MTP3 primitive before giving // up. We know Pending timeout is 2 secs semaphore.tryAcquire(3000, TimeUnit.MILLISECONDS); mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll(); assertNotNull(mtp3Primitive); assertEquals(Mtp3Primitive.PAUSE, mtp3Primitive.getType()); assertEquals(2, mtp3Primitive.getAffectedDpc()); // No more MTP3 Primitive or message assertNull(this.mtp3UserPartListener.rxMtp3PrimitivePoll()); assertNull(this.mtp3UserPartListener.rxMtp3TransferPrimitivePoll()); // Make sure we don't have any more assertNull(testAssociation.txPoll()); } @Test public void testSingleAspInAsWithoutRC() throws Exception { // 5.1.1. Single ASP in an Application Server ("1+0" sparing), TestAssociation testAssociation = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0, "testAssoc1"); AsImpl remAs = (AsImpl) serverM3UAMgmt.createAs("testas", Functionality.IPSP, ExchangeType.SE, IPSPType.SERVER, null, null, 1, null); FSM asLocalFSM = remAs.getLocalFSM(); AspFactoryImpl aspFactoryImpl = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp", "testAssoc1", false); AspImpl remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp"); // Create Route this.serverM3UAMgmt.addRoute(2, -1, -1, "testas"); FSM aspPeerFSM = remAsp.getPeerFSM(); // Check for Communication UP testAssociation.signalCommUp(); assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM)); // Peer sends ASP_UP M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP); aspFactoryImpl.read(message); assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1)); // also the AS should be INACTIVE now assertEquals(AsState.INACTIVE, this.getAsState(asLocalFSM)); // Check for ASP_ACTIVE message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE); aspFactoryImpl.read(message); assertEquals(AspState.ACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1)); // also the AS should be ACTIVE now assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM)); // Check if MTP3 RESUME received // lets wait for 2second to receive the MTP3 primitive before giving up semaphore.tryAcquire(2000, TimeUnit.MILLISECONDS); Mtp3Primitive mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll(); assertNotNull(mtp3Primitive); assertEquals(Mtp3Primitive.RESUME, mtp3Primitive.getType()); assertEquals(2, mtp3Primitive.getAffectedDpc()); // No more MTP3 Primitive or message assertNull(this.mtp3UserPartListener.rxMtp3PrimitivePoll()); assertNull(this.mtp3UserPartListener.rxMtp3TransferPrimitivePoll()); // Since we didn't set the Traffic Mode while creating AS, it should now // be set to loadshare as default assertEquals(TrafficModeType.Loadshare, remAs.getTrafficModeType().getMode()); // Peer sends ASP_INACTIVE message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE); aspFactoryImpl.read(message); assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1, -1)); // also the AS should be PENDING now assertEquals(AsState.PENDING, this.getAsState(asLocalFSM)); // Check for ASP_DOWN message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN); aspFactoryImpl.read(message); assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK, -1, -1)); // also the AS is PENDING assertEquals(AsState.PENDING, this.getAsState(asLocalFSM)); // lets wait for 3 seconds to receive the MTP3 primitive before giving // up. We know Pending timeout is 2 secs semaphore.tryAcquire(3000, TimeUnit.MILLISECONDS); mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll(); assertNotNull(mtp3Primitive); assertEquals(Mtp3Primitive.PAUSE, mtp3Primitive.getType()); assertEquals(2, mtp3Primitive.getAffectedDpc()); // No more MTP3 Primitive or message assertNull(this.mtp3UserPartListener.rxMtp3PrimitivePoll()); assertNull(this.mtp3UserPartListener.rxMtp3TransferPrimitivePoll()); // Make sure we don't have any more assertNull(testAssociation.txPoll()); } @Test public void testAspUpReceivedWhileASPIsAlreadyUp() throws Exception { // Test bug http://code.google.com/p/mobicents/issues/detail?id=2436 TestAssociation testAssociation1 = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0, "testAssoc1"); // 4.3.4.1. ASP Up Procedures from http://tools.ietf.org/html/rfc4666 RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 }); TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Override); // As remAs = sgw.createAppServer("testas", rc, rKey, trModType); AsImpl remAs = (AsImpl) serverM3UAMgmt.createAs("testas", Functionality.IPSP, ExchangeType.SE, IPSPType.SERVER, rc, trModType, 1, null); AspFactoryImpl aspFactoryImpl = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp", "testAssoc1", false); AspImpl remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp"); // Create Route this.serverM3UAMgmt.addRoute(2, -1, -1, "testas"); FSM aspPeerFSM = remAsp.getPeerFSM(); FSM asLocalFSM = remAs.getLocalFSM(); // Check for Communication UP testAssociation1.signalCommUp(); assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM)); // Peer sends ASP_UP M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP); aspFactoryImpl.read(message); assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation1, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1)); // also the AS should be INACTIVE now assertEquals(AsState.INACTIVE, this.getAsState(asLocalFSM)); // Check for ASP_ACTIVE message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE); ((ASPActiveImpl) message).setRoutingContext(rc); aspFactoryImpl.read(message); assertEquals(AspState.ACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1)); // also the AS should be ACTIVE now assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM)); // Check if MTP3 RESUME received // lets wait for 2second to receive the MTP3 primitive before giving up semaphore.tryAcquire(2000, TimeUnit.MILLISECONDS); Mtp3Primitive mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll(); assertNotNull(mtp3Primitive); assertEquals(Mtp3Primitive.RESUME, mtp3Primitive.getType()); assertEquals(2, mtp3Primitive.getAffectedDpc()); // No more MTP3 Primitive or message assertNull(this.mtp3UserPartListener.rxMtp3PrimitivePoll()); assertNull(this.mtp3UserPartListener.rxMtp3TransferPrimitivePoll()); // Check for ASP_UP received while ASP is already ACTIVE message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP); aspFactoryImpl.read(message); // The ASP Transitions to INACTIVE assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM)); // Receives ASP_UP Ack messages assertTrue(validateMessage(testAssociation1, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1)); // As well as receives Error message assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.ERROR, ErrorCode.Unexpected_Message, 100)); // also the AS should be PENDING now assertEquals(AsState.PENDING, this.getAsState(asLocalFSM)); // lets wait for 3 seconds to receive the MTP3 primitive before giving // up. We know Pending timeout is 2 secs semaphore.tryAcquire(3000, TimeUnit.MILLISECONDS); mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll(); assertNotNull(mtp3Primitive); assertEquals(Mtp3Primitive.PAUSE, mtp3Primitive.getType()); assertEquals(2, mtp3Primitive.getAffectedDpc()); // No more MTP3 Primitive or message assertNull(this.mtp3UserPartListener.rxMtp3PrimitivePoll()); assertNull(this.mtp3UserPartListener.rxMtp3TransferPrimitivePoll()); // Make sure we don't have any more assertNull(testAssociation1.txPoll()); } @Test public void testPendingQueue() throws Exception { TestAssociation testAssociation1 = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0, "testAssoc1"); RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 }); TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Override); AsImpl remAs = (AsImpl) serverM3UAMgmt.createAs("testas", Functionality.IPSP, ExchangeType.SE, IPSPType.SERVER, rc, trModType, 1, null); FSM asLocalFSM = remAs.getLocalFSM(); AspFactoryImpl aspFactoryImpl = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp", "testAssoc1", false); AspImpl remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp"); // Create Route this.serverM3UAMgmt.addRoute(2, -1, -1, "testas"); FSM aspPeerFSM = remAsp.getPeerFSM(); // Check for Communication UP testAssociation1.signalCommUp(); assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM)); // Peer sends ASP_UP M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP); aspFactoryImpl.read(message); assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation1, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1)); // also the AS should be INACTIVE now assertEquals(AsState.INACTIVE, this.getAsState(asLocalFSM)); // Peer sends ASP_ACTIVE message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE); ((ASPActiveImpl) message).setRoutingContext(rc); aspFactoryImpl.read(message); assertEquals(AspState.ACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1)); // also the AS should be ACTIVE now assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM)); // Check if MTP3 RESUME received // lets wait for 2second to receive the MTP3 primitive before giving up semaphore.tryAcquire(2000, TimeUnit.MILLISECONDS); Mtp3Primitive mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll(); assertNotNull(mtp3Primitive); assertEquals(Mtp3Primitive.RESUME, mtp3Primitive.getType()); assertEquals(2, mtp3Primitive.getAffectedDpc()); // No more MTP3 Primitive or message assertNull(this.mtp3UserPartListener.rxMtp3PrimitivePoll()); assertNull(this.mtp3UserPartListener.rxMtp3TransferPrimitivePoll()); // Check for ASP_INACTIVE message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE); ((ASPInactiveImpl) message).setRoutingContext(rc); aspFactoryImpl.read(message); assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM)); assertTrue(validateMessage(testAssociation1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1, -1)); // also the AS should be PENDING now assertEquals(AsState.PENDING, this.getAsState(asLocalFSM)); // Add PayloadData PayloadDataImpl payload = (PayloadDataImpl) messageFactory.createMessage(MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD); ProtocolDataImpl p1 = (ProtocolDataImpl) parmFactory.createProtocolData(1408, 123, 3, 1, 0, 1, new byte[] { 1, 2, 3, 4 }); payload.setRoutingContext(rc); payload.setData(p1); remAs.write(payload); // Now bring UP the ASP message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE); ((ASPActiveImpl) message).setRoutingContext(rc); aspFactoryImpl.read(message); assertTrue(validateMessage(testAssociation1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1)); // also the AS should be ACTIVE now assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM)); // Also we should have PayloadData M3UAMessage payLoadTemp = testAssociation1.txPoll(); assertNotNull(payLoadTemp); assertEquals(MessageClass.TRANSFER_MESSAGES, payLoadTemp.getMessageClass()); assertEquals(MessageType.PAYLOAD, payLoadTemp.getMessageType()); // No more MTP3 Primitive or message assertNull(this.mtp3UserPartListener.rxMtp3PrimitivePoll()); assertNull(this.mtp3UserPartListener.rxMtp3TransferPrimitivePoll()); // Make sure we don't have any more assertNull(testAssociation1.txPoll()); } /** * * @param factory * @param msgClass * @param msgType * @param type The type for Notify message Or Error Code for Error Messages * @param info The Info for Notify message Or RoutingContext for Error Message * @return */ private boolean validateMessage(TestAssociation testAssociation, int msgClass, int msgType, int type, int info) { M3UAMessage message = testAssociation.txPoll(); if (message == null) { return false; } if (message.getMessageClass() != msgClass || message.getMessageType() != msgType) { return false; } if (message.getMessageClass() == MessageClass.MANAGEMENT) { if (message.getMessageType() == MessageType.NOTIFY) { Status s = ((Notify) message).getStatus(); if (s.getType() != type || s.getInfo() != info) { return false; } else { return true; } } else if (message.getMessageType() == MessageType.ERROR) { ErrorCode errCode = ((org.mobicents.protocols.ss7.m3ua.message.mgmt.Error) message).getErrorCode(); if (errCode.getCode() != type) { return false; } RoutingContext rc = ((org.mobicents.protocols.ss7.m3ua.message.mgmt.Error) message).getRoutingContext(); if (rc == null || rc.getRoutingContexts()[0] != info) { return false; } return true; } return false; } else { return true; } } class TestAssociation implements Association { private AssociationListener associationListener = null; private String name = null; private LinkedList<M3UAMessage> messageRxFromUserPart = new LinkedList<M3UAMessage>(); TestAssociation(String name) { this.name = name; } M3UAMessage txPoll() { return messageRxFromUserPart.poll(); } @Override public AssociationListener getAssociationListener() { return this.associationListener; } @Override public String getHostAddress() { return null; } @Override public int getHostPort() { return 0; } @Override public String getName() { return null; } @Override public String getPeerAddress() { return null; } @Override public int getPeerPort() { return 0; } @Override public String getServerName() { return null; } @Override public boolean isStarted() { return false; } @Override public void send(PayloadData payloadData) throws Exception { M3UAMessage m3uaMessage = messageFactory.createMessage(payloadData.getByteBuf()); this.messageRxFromUserPart.add(m3uaMessage); } @Override public void setAssociationListener(AssociationListener associationListener) { this.associationListener = associationListener; } public void signalCommUp() { this.associationListener.onCommunicationUp(this, 1, 1); } public void signalCommLost() { this.associationListener.onCommunicationLost(this); } @Override public IpChannelType getIpChannelType() { // TODO Auto-generated method stub return null; } @Override public AssociationType getAssociationType() { // TODO Auto-generated method stub return null; } @Override public String[] getExtraHostAddresses() { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see org.mobicents.protocols.api.Association#isConnected() */ @Override public boolean isConnected() { // TODO Auto-generated method stub return false; } @Override public void acceptAnonymousAssociation(AssociationListener arg0) throws Exception { // TODO Auto-generated method stub } @Override public void rejectAnonymousAssociation() { // TODO Auto-generated method stub } @Override public void stopAnonymousAssociation() throws Exception { // TODO Auto-generated method stub } @Override public boolean isUp() { // TODO Auto-generated method stub return false; } @Override public ByteBufAllocator getByteBufAllocator() throws Exception { // TODO Auto-generated method stub return null; } @Override public int getCongestionLevel() { // TODO Auto-generated method stub return 0; } } class NettyTransportManagement implements Management { private FastMap<String, Association> associations = new FastMap<String, Association>(); @Override public Association addAssociation(String hostAddress, int hostPort, String peerAddress, int peerPort, String assocName) throws Exception { TestAssociation testAssociation = new TestAssociation(assocName); this.associations.put(assocName, testAssociation); return testAssociation; } @Override public Server addServer(String serverName, String hostAddress, int port) throws Exception { // TODO Auto-generated method stub return null; } @Override public Association addServerAssociation(String peerAddress, int peerPort, String serverName, String assocName) throws Exception { // TODO Auto-generated method stub return null; } @Override public Association getAssociation(String assocName) throws Exception { return this.associations.get(assocName); } @Override public Map<String, Association> getAssociations() { return associations.unmodifiable(); } @Override public int getConnectDelay() { return 0; } @Override public String getName() { return null; } @Override public List<Server> getServers() { return null; } @Override public int getWorkerThreads() { return 0; } @Override public boolean isSingleThread() { return false; } @Override public void removeAssociation(String assocName) throws Exception { } @Override public void removeServer(String serverName) throws Exception { } @Override public void setConnectDelay(int connectDelay) { } @Override public void setSingleThread(boolean arg0) { // TODO Auto-generated method stub } @Override public void setWorkerThreads(int arg0) { // TODO Auto-generated method stub } @Override public void start() throws Exception { // TODO Auto-generated method stub } @Override public void startAssociation(String arg0) throws Exception { // TODO Auto-generated method stub } @Override public void startServer(String arg0) throws Exception { // TODO Auto-generated method stub } @Override public void stop() throws Exception { // TODO Auto-generated method stub } @Override public void stopAssociation(String arg0) throws Exception { // TODO Auto-generated method stub } @Override public void stopServer(String arg0) throws Exception { // TODO Auto-generated method stub } @Override public String getPersistDir() { // TODO Auto-generated method stub return null; } @Override public void setPersistDir(String arg0) { // TODO Auto-generated method stub } @Override public Association addAssociation(String arg0, int arg1, String arg2, int arg3, String arg4, IpChannelType arg5, String[] extraHostAddresses) throws Exception { // TODO Auto-generated method stub return null; } @Override public Server addServer(String arg0, String arg1, int arg2, IpChannelType arg3, String[] extraHostAddresses) throws Exception { // TODO Auto-generated method stub return null; } @Override public Association addServerAssociation(String arg0, int arg1, String arg2, String arg3, IpChannelType arg4) throws Exception { // TODO Auto-generated method stub return null; } @Override public void removeAllResourses() throws Exception { // TODO Auto-generated method stub } @Override public void addManagementEventListener(ManagementEventListener arg0) { // TODO Auto-generated method stub } @Override public Server addServer(String arg0, String arg1, int arg2, IpChannelType arg3, boolean arg4, int arg5, String[] arg6) throws Exception { // TODO Auto-generated method stub return null; } @Override public ServerListener getServerListener() { // TODO Auto-generated method stub return null; } @Override public void removeManagementEventListener(ManagementEventListener arg0) { // TODO Auto-generated method stub } @Override public void setServerListener(ServerListener arg0) { // TODO Auto-generated method stub } /* * (non-Javadoc) * * @see org.mobicents.protocols.api.Management#isStarted() */ @Override public boolean isStarted() { // TODO Auto-generated method stub return false; } @Override public double getCongControl_BackToNormalDelayThreshold_1() { // TODO Auto-generated method stub return 0; } @Override public double getCongControl_BackToNormalDelayThreshold_2() { // TODO Auto-generated method stub return 0; } @Override public double getCongControl_BackToNormalDelayThreshold_3() { // TODO Auto-generated method stub return 0; } @Override public double getCongControl_DelayThreshold_1() { // TODO Auto-generated method stub return 0; } @Override public double getCongControl_DelayThreshold_2() { // TODO Auto-generated method stub return 0; } @Override public double getCongControl_DelayThreshold_3() { // TODO Auto-generated method stub return 0; } @Override public void setCongControl_BackToNormalDelayThreshold_1(double arg0) throws Exception { // TODO Auto-generated method stub } @Override public void setCongControl_BackToNormalDelayThreshold_2(double arg0) throws Exception { // TODO Auto-generated method stub } @Override public void setCongControl_BackToNormalDelayThreshold_3(double arg0) throws Exception { // TODO Auto-generated method stub } @Override public void setCongControl_DelayThreshold_1(double arg0) throws Exception { // TODO Auto-generated method stub } @Override public void setCongControl_DelayThreshold_2(double arg0) throws Exception { // TODO Auto-generated method stub } @Override public void setCongControl_DelayThreshold_3(double arg0) throws Exception { // TODO Auto-generated method stub } @Override public Boolean getOptionSctpDisableFragments() { // TODO Auto-generated method stub return null; } @Override public Integer getOptionSctpFragmentInterleave() { // TODO Auto-generated method stub return null; } @Override public Boolean getOptionSctpNodelay() { // TODO Auto-generated method stub return null; } @Override public Integer getOptionSoLinger() { // TODO Auto-generated method stub return null; } @Override public Integer getOptionSoRcvbuf() { // TODO Auto-generated method stub return null; } @Override public Integer getOptionSoSndbuf() { // TODO Auto-generated method stub return null; } @Override public void setOptionSctpDisableFragments(Boolean arg0) { // TODO Auto-generated method stub } @Override public void setOptionSctpFragmentInterleave(Integer arg0) { // TODO Auto-generated method stub } @Override public void setOptionSctpNodelay(Boolean arg0) { // TODO Auto-generated method stub } @Override public void setOptionSoLinger(Integer arg0) { // TODO Auto-generated method stub } @Override public void setOptionSoRcvbuf(Integer arg0) { // TODO Auto-generated method stub } @Override public void setOptionSoSndbuf(Integer arg0) { // TODO Auto-generated method stub } @Override public Integer getOptionSctpInitMaxstreams_MaxInStreams() { // TODO Auto-generated method stub return null; } @Override public Integer getOptionSctpInitMaxstreams_MaxOutStreams() { // TODO Auto-generated method stub return null; } @Override public void setOptionSctpInitMaxstreams_MaxInStreams(Integer arg0) { // TODO Auto-generated method stub } @Override public void setOptionSctpInitMaxstreams_MaxOutStreams(Integer arg0) { // TODO Auto-generated method stub } @Override public void addCongestionListener(CongestionListener arg0) { // TODO Auto-generated method stub } @Override public void removeCongestionListener(CongestionListener arg0) { // TODO Auto-generated method stub } @Override public int getBufferSize() { // TODO Auto-generated method stub return 0; } @Override public void setBufferSize(int arg0) throws Exception { // TODO Auto-generated method stub } } class Mtp3UserPartListenerimpl implements Mtp3UserPartListener { private LinkedList<Mtp3Primitive> mtp3Primitives = new LinkedList<Mtp3Primitive>(); private LinkedList<Mtp3TransferPrimitive> mtp3TransferPrimitives = new LinkedList<Mtp3TransferPrimitive>(); Mtp3Primitive rxMtp3PrimitivePoll() { return this.mtp3Primitives.poll(); } Mtp3TransferPrimitive rxMtp3TransferPrimitivePoll() { return this.mtp3TransferPrimitives.poll(); } @Override public void onMtp3PauseMessage(Mtp3PausePrimitive pause) { this.mtp3Primitives.add(pause); semaphore.release(); } @Override public void onMtp3ResumeMessage(Mtp3ResumePrimitive resume) { this.mtp3Primitives.add(resume); semaphore.release(); } @Override public void onMtp3StatusMessage(Mtp3StatusPrimitive status) { this.mtp3Primitives.add(status); semaphore.release(); } @Override public void onMtp3TransferMessage(Mtp3TransferPrimitive transfer) { this.mtp3TransferPrimitives.add(transfer); semaphore.release(); } @Override public void onMtp3EndCongestionMessage(Mtp3EndCongestionPrimitive msg) { this.mtp3Primitives.add(msg); semaphore.release(); } } }