/*
* 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.assertFalse;
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.FastList;
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.As;
import org.mobicents.protocols.ss7.m3ua.Asp;
import org.mobicents.protocols.ss7.m3ua.AspFactory;
import org.mobicents.protocols.ss7.m3ua.ExchangeType;
import org.mobicents.protocols.ss7.m3ua.Functionality;
import org.mobicents.protocols.ss7.m3ua.M3UAManagementEventListener;
import org.mobicents.protocols.ss7.m3ua.State;
import org.mobicents.protocols.ss7.m3ua.Util;
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.DestinationPointCode;
import org.mobicents.protocols.ss7.m3ua.parameter.ErrorCode;
import org.mobicents.protocols.ss7.m3ua.parameter.LocalRKIdentifier;
import org.mobicents.protocols.ss7.m3ua.parameter.RoutingContext;
import org.mobicents.protocols.ss7.m3ua.parameter.RoutingKey;
import org.mobicents.protocols.ss7.m3ua.parameter.ServiceIndicators;
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.Mtp3TransferPrimitiveFactory;
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;
/**
* This test is for FSM for SGW side ASP and AS
*
* @author amit bhayani
*
*/
public class SgFSMTest {
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;
private M3UAManagementEventListenerImpl m3uaManagementEventListenerImpl = null;
public SgFSMTest() {
}
@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.m3uaManagementEventListenerImpl = new M3UAManagementEventListenerImpl();
this.transportManagement = new NettyTransportManagement();
this.transportManagement.setPersistDir(Util.getTmpTestDir());
this.serverM3UAMgmt = new M3UAManagementImpl("SgFSMTest", null);
this.serverM3UAMgmt.setPersistDir(Util.getTmpTestDir());
this.serverM3UAMgmt.addM3UAManagementEventListener(this.m3uaManagementEventListenerImpl);
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),
int m3uaManagementEventsSeq = 0;
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.SGW, ExchangeType.SE, null, rc, null, 1, null);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
FSM asLocalFSM = remAs.getLocalFSM();
AspFactoryImpl aspFactoryImpl = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp", "testAssoc1", false);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactoryImpl }, m3uaManagementEventsSeq++)));
AspImpl remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp");
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs, remAsp }, m3uaManagementEventsSeq++)));
// 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));
assertEquals(remAsp.getState().getName(), State.STATE_DOWN);
// Check for ASP_UP
M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
aspFactoryImpl.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM));
assertEquals(remAsp.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsInactive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_INACTIVE));
// 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));
assertEquals(remAsp.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsActive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_ACTIVE));
// 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));
assertEquals(remAsp.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_PENDING);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsPending, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_PENDING));
// Check for ASP_DOWN
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactoryImpl.read(message);
assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM));
assertEquals(remAsp.getState().getName(), State.STATE_DOWN);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspDown, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK, -1, -1));
// 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);
assertEquals(remAs.getState().getName(), State.STATE_DOWN);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsDown, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
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),
int m3uaManagementEventsSeq = 0;
TestAssociation testAssociation = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0,
"testAssoc1");
AsImpl remAs = (AsImpl) serverM3UAMgmt
.createAs("testas", Functionality.SGW, ExchangeType.SE, null, null, null, 1, null);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
FSM asLocalFSM = remAs.getLocalFSM();
AspFactoryImpl aspFactoryImpl = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp", "testAssoc1", false);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactoryImpl }, m3uaManagementEventsSeq++)));
AspImpl remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp");
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs, remAsp }, m3uaManagementEventsSeq++)));
// 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));
// Check for ASP_UP
M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
aspFactoryImpl.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM));
assertEquals(remAsp.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsInactive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_INACTIVE));
// Check for ASP_ACTIVE
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
aspFactoryImpl.read(message);
assertEquals(AspState.ACTIVE, this.getAspState(aspPeerFSM));
assertEquals(remAsp.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsActive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_ACTIVE));
// 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);
aspFactoryImpl.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM));
assertEquals(remAsp.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_PENDING);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsPending, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_PENDING));
// Check for ASP_DOWN
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactoryImpl.read(message);
assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM));
assertEquals(remAsp.getState().getName(), State.STATE_DOWN);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspDown, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK, -1, -1));
// 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);
assertEquals(remAs.getState().getName(), State.STATE_DOWN);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsDown, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
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 testSingleAspInMultipleAs() throws Exception {
// 5.1.1.3. Single ASP in Multiple Application Servers (Each with "1+0"
// Sparing)
int m3uaManagementEventsSeq = 0;
TestAssociation testAssociation = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0,
"testAssoc1");
// Define 1st AS
RoutingContext rc1 = parmFactory.createRoutingContext(new long[] { 100 });
// As remAs1 = sgw.createAppServer("testas1", rc1, rKey1, trModType1);
AsImpl remAs1 = (AsImpl) serverM3UAMgmt.createAs("testas1", Functionality.SGW, ExchangeType.SE, null, rc1, null, 1,
null);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs1 }, m3uaManagementEventsSeq++)));
FSM as1LocalFSM = remAs1.getLocalFSM();
// Define 2nd AS
RoutingContext rc2 = parmFactory.createRoutingContext(new long[] { 200 });
// As remAs2 = sgw.createAppServer("testas2", rc2, rKey2, trModType2);
AsImpl remAs2 = (AsImpl) serverM3UAMgmt.createAs("testas2", Functionality.SGW, ExchangeType.SE, null, rc2, null, 1,
null);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs2 }, m3uaManagementEventsSeq++)));
FSM as2LocalFSM = remAs2.getLocalFSM();
// AspFactory aspFactory = sgw.createAspFactory("testasp", "127.0.0.1",
// 2777);
AspFactoryImpl aspFactoryImpl = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp", "testAssoc1", false);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactoryImpl }, m3uaManagementEventsSeq++)));
// Both ASP uses same underlying M3UAChannel
AspImpl remAsp1 = serverM3UAMgmt.assignAspToAs("testas1", "testasp");
AspImpl remAsp2 = serverM3UAMgmt.assignAspToAs("testas2", "testasp");
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs1, remAsp1 }, m3uaManagementEventsSeq++)));
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs2, remAsp2 }, m3uaManagementEventsSeq++)));
FSM asp1PeerFSM = remAsp1.getPeerFSM();
FSM asp2PeerFSM = remAsp2.getPeerFSM();
// Check for Communication UP
testAssociation.signalCommUp();
assertEquals(AspState.DOWN, this.getAspState(asp1PeerFSM));
assertEquals(AspState.DOWN, this.getAspState(asp2PeerFSM));
// Both AS are yet DOWN
assertEquals(AsState.DOWN, this.getAsState(as1LocalFSM));
assertEquals(AsState.DOWN, this.getAsState(as2LocalFSM));
// Check for ASP_UP
M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
aspFactoryImpl.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(asp1PeerFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsInactive, System
.currentTimeMillis(), new Object[] { remAs1 }, m3uaManagementEventsSeq++)));
assertEquals(AspState.INACTIVE, this.getAspState(asp2PeerFSM));
assertEquals(remAsp2.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp2 }, m3uaManagementEventsSeq++)));
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsInactive, System
.currentTimeMillis(), new Object[] { remAs2 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
// also both the AS should be INACTIVE now
assertEquals(AsState.INACTIVE, this.getAsState(as1LocalFSM));
assertEquals(remAs1.getState().getName(), State.STATE_INACTIVE);
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_INACTIVE));
assertEquals(AsState.INACTIVE, this.getAsState(as2LocalFSM));
assertEquals(remAs2.getState().getName(), State.STATE_INACTIVE);
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_INACTIVE));
// Check for ASP_ACTIVE for both Routing Contexts
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
((ASPActiveImpl) message).setRoutingContext(this.parmFactory.createRoutingContext(new long[] { 100, 200 }));
aspFactoryImpl.read(message);
assertEquals(AspState.ACTIVE, this.getAspState(asp1PeerFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsActive, System
.currentTimeMillis(), new Object[] { remAs1 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
assertEquals(AspState.ACTIVE, this.getAspState(asp2PeerFSM));
assertEquals(remAsp2.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp2 }, m3uaManagementEventsSeq++)));
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsActive, System
.currentTimeMillis(), new Object[] { remAs2 }, m3uaManagementEventsSeq++)));
// also both the AS should be ACTIVE now
assertEquals(AsState.ACTIVE, this.getAsState(as1LocalFSM));
assertEquals(remAs1.getState().getName(), State.STATE_ACTIVE);
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_ACTIVE));
// We will have two ACK's one each for each RC
assertTrue(validateMessage(testAssociation, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
assertEquals(AsState.ACTIVE, this.getAsState(as2LocalFSM));
assertEquals(remAs2.getState().getName(), State.STATE_ACTIVE);
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_ACTIVE));
// Check for ASP_INACTIVE for ASP1
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
((ASPInactiveImpl) message).setRoutingContext(this.parmFactory.createRoutingContext(new long[] { 100 }));
aspFactoryImpl.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(asp1PeerFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
// The ASP2 should still be ACTIVE as we sent ASP_INACTIVE only for 100
// RC
assertEquals(AspState.ACTIVE, this.getAspState(asp2PeerFSM));
assertTrue(validateMessage(testAssociation, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1, -1));
// AS1 should be PENDING now
assertEquals(AsState.PENDING, this.getAsState(as1LocalFSM));
assertEquals(remAs1.getState().getName(), State.STATE_PENDING);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsPending, System
.currentTimeMillis(), new Object[] { remAs1 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_AS_State_Change,
Status.INFO_AS_PENDING));
// But AS2 is still ACTIVE
assertEquals(AsState.ACTIVE, this.getAsState(as2LocalFSM));
// Check for ASP_DOWN
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactoryImpl.read(message);
assertEquals(AspState.DOWN, this.getAspState(asp1PeerFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_DOWN);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspDown, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
assertEquals(AspState.DOWN, this.getAspState(asp2PeerFSM));
assertEquals(remAsp2.getState().getName(), State.STATE_DOWN);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspDown, System
.currentTimeMillis(), new Object[] { remAsp2 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK, -1, -1));
// Make sure we don't have any more messages to be sent
assertNull(testAssociation.txPoll());
semaphore.tryAcquire(3000, TimeUnit.MILLISECONDS);
assertEquals(remAs1.getState().getName(), State.STATE_DOWN);
// assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new
// TestEvent(TestEventType.AsDown, System
// .currentTimeMillis(), new Object[] { remAs1 },
// m3uaManagementEventsSeq++)));
assertEquals(remAs2.getState().getName(), State.STATE_DOWN);
// assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new
// TestEvent(TestEventType.AsDown, System
// .currentTimeMillis(), new Object[] { remAs2 },
// m3uaManagementEventsSeq++)));
}
@Test
public void testTwoAspInAsOverride() throws Exception {
// 5.1.2. Two ASPs in Application Server ("1+1" Sparing)
int m3uaManagementEventsSeq = 0;
TestAssociation testAssociation1 = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0,
"testAssoc1");
TestAssociation testAssociation2 = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0,
"testAssoc2");
RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 });
TrafficModeType overrideMode = parmFactory.createTrafficModeType(TrafficModeType.Override);
// As remAs = sgw.createAppServer("testas", rc, rKey, trModType);
AsImpl remAs = (AsImpl) serverM3UAMgmt.createAs("testas", Functionality.SGW, ExchangeType.SE, null, rc, overrideMode,
1, null);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
FSM asLocalFSM = remAs.getLocalFSM();
// Create first ASPFactory
AspFactoryImpl aspFactory1 = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp1", "testAssoc1", false);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactory1 }, m3uaManagementEventsSeq++)));
// Create Second ASPFactory
AspFactoryImpl aspFactory2 = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp2", "testAssoc2", false);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactory2 }, m3uaManagementEventsSeq++)));
AspImpl remAsp1 = serverM3UAMgmt.assignAspToAs("testas", "testasp1");
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs, remAsp1 }, m3uaManagementEventsSeq++)));
AspImpl remAsp2 = serverM3UAMgmt.assignAspToAs("testas", "testasp2");
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs, remAsp2 }, m3uaManagementEventsSeq++)));
FSM asp1PeerFSM = remAsp1.getPeerFSM();
FSM asp2PeerFSM = remAsp2.getPeerFSM();
// Check for Communication UP for ASP1
testAssociation1.signalCommUp();
assertEquals(AspState.DOWN, this.getAspState(asp1PeerFSM));
// Check for Communication UP for ASP2
testAssociation2.signalCommUp();
assertEquals(AspState.DOWN, this.getAspState(asp2PeerFSM));
// Check for ASP_UP for ASP1
M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
aspFactory1.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(asp1PeerFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsInactive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
// Check for ASP_UP for ASP2
aspFactory2.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(asp2PeerFSM));
assertEquals(remAsp2.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp2 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation2, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
// AS is still INACTIVE now
assertEquals(AsState.INACTIVE, this.getAsState(asLocalFSM));
assertEquals(remAs.getState().getName(), State.STATE_INACTIVE);
assertTrue(validateMessage(testAssociation2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
// Check for ASP_ACTIVE for ASP1
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
((ASPActiveImpl) message).setRoutingContext(rc);
aspFactory1.read(message);
assertEquals(AspState.ACTIVE, this.getAspState(asp1PeerFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
// also the AS should be ACTIVE now and NOTIFY ACTIVE should be delivered to
// both the ASPs
assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM));
assertEquals(remAs.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsActive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
assertTrue(validateMessage(testAssociation2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
// INACTIVATE the ASP1
// 5.2.1. 1+1 Sparing, Withdrawal of ASP, Backup Override
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
((ASPInactiveImpl) message).setRoutingContext(rc);
aspFactory1.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(asp1PeerFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1, -1));
// also the AS should be PENDING now and should send PENDING NTFY to
// both the ASPS
assertEquals(AsState.PENDING, this.getAsState(asLocalFSM));
assertEquals(remAs.getState().getName(), State.STATE_PENDING);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsPending, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
assertTrue(validateMessage(testAssociation2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
// ACTIVATE ASP2
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
((ASPActiveImpl) message).setRoutingContext(rc);
aspFactory2.read(message);
assertEquals(AspState.ACTIVE, this.getAspState(asp2PeerFSM));
assertEquals(remAsp2.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp2 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation2, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
// also the AS should be ACTIVE now and ACTIVE should be delivered to
// both the ASPs
assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM));
assertEquals(remAs.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsActive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
// 5.2.2. 1+1 Sparing, Backup Override
// ACTIVATE ASP1 also
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
((ASPActiveImpl) message).setRoutingContext(rc);
aspFactory1.read(message);
assertEquals(AspState.ACTIVE, this.getAspState(asp1PeerFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
// The AS remains ACTIVE and sends NTFY(Alt ASP-Act) to ASP2
assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM));
// ASP2 should get Alternate ASP is active
assertTrue(validateMessage(testAssociation2, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_Other,
Status.INFO_Alternate_ASP_Active));
// The state of ASP2 now should be INACTIVE
assertEquals(AspState.INACTIVE, this.getAspState(asp2PeerFSM));
assertEquals(remAsp2.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp2 }, m3uaManagementEventsSeq++)));
assertNull(testAssociation1.txPoll());
assertNull(testAssociation2.txPoll());
// Check for ASP_DOWN for aspFactory1
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactory1.read(message);
assertEquals(AspState.DOWN, this.getAspState(asp1PeerFSM));
assertTrue(validateMessage(testAssociation1, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK, -1, -1));
// Make sure we don't have any more messages to be sent
assertNull(testAssociation1.txPoll());
// Check for ASP_DOWN for aspFactory2
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactory2.read(message);
assertEquals(AspState.DOWN, this.getAspState(asp2PeerFSM));
// TODO fix these below asserts fails
// assertTrue(validateMessage(testAssociation2,
// MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK,
// -1,-1));
// Make sure we don't have any more messages to be sent
// assertNull(testAssociation2.txPoll());
}
@Test
public void testTwoAsInLoadBalance() throws Exception {
int m3uaManagementEventsSeq = 0;
Mtp3TransferPrimitiveFactory factory = this.serverM3UAMgmt.getMtp3TransferPrimitiveFactory();
this.transportManagement.addAssociation(null, 0, null, 0, "testAssoc1");
this.transportManagement.addAssociation(null, 0, null, 0, "testAssoc2");
// Define 1st AS
AsImpl remAs1 = (AsImpl) this.serverM3UAMgmt.createAs("testas1", Functionality.SGW, ExchangeType.SE, null, null, null,
1, null);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs1 }, m3uaManagementEventsSeq++)));
// Define 2nd AS
AsImpl remAs2 = (AsImpl) serverM3UAMgmt.createAs("testas2", Functionality.SGW, ExchangeType.SE, null, null, null, 1,
null);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs2 }, m3uaManagementEventsSeq++)));
// Define AspFactory 1
AspFactoryImpl aspFactoryImpl1 = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp1", "testAssoc1", false);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactoryImpl1 }, m3uaManagementEventsSeq++)));
// Define AspFactory 2
AspFactoryImpl aspFactoryImpl2 = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp2", "testAssoc2", false);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactoryImpl2 }, m3uaManagementEventsSeq++)));
// TODO : Call start from management
aspFactoryImpl1.start();
aspFactoryImpl2.start();
AspImpl remAsp1 = serverM3UAMgmt.assignAspToAs("testas1", "testasp1");
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs1, remAsp1 }, m3uaManagementEventsSeq++)));
AspImpl remAsp2 = serverM3UAMgmt.assignAspToAs("testas2", "testasp2");
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs2, remAsp2 }, m3uaManagementEventsSeq++)));
// Create Route
this.serverM3UAMgmt.addRoute(2, -1, -1, "testas1");
this.serverM3UAMgmt.addRoute(2, -1, -1, "testas2");
// Signal for Communication UP
TestAssociation testAssociation1 = (TestAssociation) this.transportManagement.getAssociation("testAssoc1");
testAssociation1.signalCommUp();
// Signal for Communication UP
TestAssociation testAssociation2 = (TestAssociation) this.transportManagement.getAssociation("testAssoc2");
testAssociation2.signalCommUp();
// Check for ASP_UP for ASP1/2
M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
aspFactoryImpl1.read(message);
aspFactoryImpl2.read(message);
// Check for ASP_ACTIVE for ASP1/2
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
aspFactoryImpl1.read(message);
// Check if MTP3 RESUME received
// lets wait for 2second to receive the MTP3 primitive before giving up
semaphore.tryAcquire(2000, TimeUnit.MILLISECONDS);
// The route should be RESUME
Mtp3Primitive mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll();
assertNotNull(mtp3Primitive);
assertEquals(Mtp3Primitive.RESUME, mtp3Primitive.getType());
aspFactoryImpl2.read(message);
// Send Transfer Message and check load balancing behavior
// int si, int ni, int mp, int opc, int dpc, int sls, byte[] data,
// RoutingLabelFormat pointCodeFormat
testAssociation1.clearRxMessages();
testAssociation2.clearRxMessages();
for (int sls = 0; sls < 256; sls++) {
Mtp3TransferPrimitive mtp3TransferPrimitive = factory.createMtp3TransferPrimitive(3, 1, 0, 1, 2, sls, new byte[] {
1, 2, 3, 4 });
serverM3UAMgmt.sendMessage(mtp3TransferPrimitive);
}
for (int count = 0; count < 128; count++) {
assertTrue(validateMessage(testAssociation1, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
}
for (int count = 0; count < 128; count++) {
assertTrue(validateMessage(testAssociation2, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
}
// No more messages to be transmitted
assertFalse(validateMessage(testAssociation1, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
assertFalse(validateMessage(testAssociation2, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
// bring DOWN ASP1.
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
aspFactoryImpl1.read(message);
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactoryImpl1.read(message);
// 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);
// PAUSE for DPC 2
mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll();
assertNull(mtp3Primitive);
// Lets send the Payload again and this time it will be always go from AS2
testAssociation1.clearRxMessages();
testAssociation2.clearRxMessages();
for (int sls = 0; sls < 256; sls++) {
Mtp3TransferPrimitive mtp3TransferPrimitive = factory.createMtp3TransferPrimitive(3, 1, 0, 1, 2, sls, new byte[] {
1, 2, 3, 4 });
serverM3UAMgmt.sendMessage(mtp3TransferPrimitive);
}
for (int count = 0; count < 256; count++) {
assertTrue(validateMessage(testAssociation2, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
}
// No more messages to be transmitted
assertFalse(validateMessage(testAssociation1, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
assertFalse(validateMessage(testAssociation2, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
// bring DOWN ASP2.
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
aspFactoryImpl2.read(message);
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactoryImpl2.read(message);
// 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);
// PAUSE for DPC 2
mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll();
assertNotNull(mtp3Primitive);
assertEquals(Mtp3Primitive.PAUSE, mtp3Primitive.getType());
assertEquals(2, mtp3Primitive.getAffectedDpc());
}
@Test
public void testTwoAsInOverride() throws Exception {
int m3uaManagementEventsSeq = 0;
Mtp3TransferPrimitiveFactory factory = this.serverM3UAMgmt.getMtp3TransferPrimitiveFactory();
this.transportManagement.addAssociation(null, 0, null, 0, "testAssoc1");
this.transportManagement.addAssociation(null, 0, null, 0, "testAssoc2");
// Define 1st AS
AsImpl remAs1 = (AsImpl) this.serverM3UAMgmt.createAs("testas1", Functionality.SGW, ExchangeType.SE, null, null, null,
1, null);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs1 }, m3uaManagementEventsSeq++)));
// Define 2nd AS
AsImpl remAs2 = (AsImpl) serverM3UAMgmt.createAs("testas2", Functionality.SGW, ExchangeType.SE, null, null, null, 1,
null);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs2 }, m3uaManagementEventsSeq++)));
// Define AspFactory 1
AspFactoryImpl aspFactoryImpl1 = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp1", "testAssoc1", false);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactoryImpl1 }, m3uaManagementEventsSeq++)));
// Define AspFactory 2
AspFactoryImpl aspFactoryImpl2 = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp2", "testAssoc2", false);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactoryImpl2 }, m3uaManagementEventsSeq++)));
// TODO : Call start from management
aspFactoryImpl1.start();
aspFactoryImpl2.start();
AspImpl remAsp1 = serverM3UAMgmt.assignAspToAs("testas1", "testasp1");
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs1, remAsp1 }, m3uaManagementEventsSeq++)));
AspImpl remAsp2 = serverM3UAMgmt.assignAspToAs("testas2", "testasp2");
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs2, remAsp2 }, m3uaManagementEventsSeq++)));
// Create Route
this.serverM3UAMgmt.addRoute(2, -1, -1, "testas1", TrafficModeType.Override);
this.serverM3UAMgmt.addRoute(2, -1, -1, "testas2", TrafficModeType.Override);
// Signal for Communication UP
TestAssociation testAssociation1 = (TestAssociation) this.transportManagement.getAssociation("testAssoc1");
testAssociation1.signalCommUp();
// Signal for Communication UP
TestAssociation testAssociation2 = (TestAssociation) this.transportManagement.getAssociation("testAssoc2");
testAssociation2.signalCommUp();
// Check for ASP_UP for ASP1/2
M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
aspFactoryImpl1.read(message);
aspFactoryImpl2.read(message);
// Check for ASP_ACTIVE for ASP1/2
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
aspFactoryImpl1.read(message);
// Check if MTP3 RESUME received
// lets wait for 2second to receive the MTP3 primitive before giving up
semaphore.tryAcquire(2000, TimeUnit.MILLISECONDS);
// The route should be RESUME
Mtp3Primitive mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll();
assertNotNull(mtp3Primitive);
assertEquals(Mtp3Primitive.RESUME, mtp3Primitive.getType());
aspFactoryImpl2.read(message);
// Send Transfer Message and check load balancing behavior
// int si, int ni, int mp, int opc, int dpc, int sls, byte[] data,
// RoutingLabelFormat pointCodeFormat
testAssociation1.clearRxMessages();
testAssociation2.clearRxMessages();
for (int sls = 0; sls < 256; sls++) {
Mtp3TransferPrimitive mtp3TransferPrimitive = factory.createMtp3TransferPrimitive(3, 1, 0, 1, 2, sls, new byte[] {
1, 2, 3, 4 });
serverM3UAMgmt.sendMessage(mtp3TransferPrimitive);
}
for (int count = 0; count < 256; count++) {
assertTrue(validateMessage(testAssociation1, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
}
//No messages goes to AS2
assertFalse(validateMessage(testAssociation2, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
// No more messages to be transmitted
assertFalse(validateMessage(testAssociation1, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
assertFalse(validateMessage(testAssociation2, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
// bring DOWN ASP1.
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
aspFactoryImpl1.read(message);
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactoryImpl1.read(message);
// 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);
// PAUSE for DPC 2
mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll();
assertNull(mtp3Primitive);
// Lets send the Payload again and this time it will be always go from AS2
testAssociation1.clearRxMessages();
testAssociation2.clearRxMessages();
for (int sls = 0; sls < 256; sls++) {
Mtp3TransferPrimitive mtp3TransferPrimitive = factory.createMtp3TransferPrimitive(3, 1, 0, 1, 2, sls, new byte[] {
1, 2, 3, 4 });
serverM3UAMgmt.sendMessage(mtp3TransferPrimitive);
}
for (int count = 0; count < 256; count++) {
assertTrue(validateMessage(testAssociation2, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
}
// No more messages to be transmitted
assertFalse(validateMessage(testAssociation1, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
assertFalse(validateMessage(testAssociation2, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
// bring DOWN ASP2.
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
aspFactoryImpl2.read(message);
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactoryImpl2.read(message);
// 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);
// PAUSE for DPC 2
mtp3Primitive = this.mtp3UserPartListener.rxMtp3PrimitivePoll();
assertNotNull(mtp3Primitive);
assertEquals(Mtp3Primitive.PAUSE, mtp3Primitive.getType());
assertEquals(2, mtp3Primitive.getAffectedDpc());
}
@Test
public void testTwoAspInAsLoadshare() throws Exception {
// 5.1.2. Two ASPs in Application Server ("1+1" Sparing)
int m3uaManagementEventsSeq = 0;
int dpc = 2;
int opc = 1;
int si = 3;
int ni = 1;
int mp = 0;
Mtp3TransferPrimitiveFactory factory = serverM3UAMgmt.getMtp3TransferPrimitiveFactory();
TestAssociation testAssociation1 = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0,
"testAssoc1");
TestAssociation testAssociation2 = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0,
"testAssoc2");
RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 });
DestinationPointCode[] dpcObj = new DestinationPointCode[] { parmFactory.createDestinationPointCode(123, (short) 0) };
ServiceIndicators[] servInds = new ServiceIndicators[] { parmFactory.createServiceIndicators(new short[] { 3 }) };
TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Loadshare);
LocalRKIdentifier lRkId = parmFactory.createLocalRKIdentifier(1);
RoutingKey rKey = parmFactory.createRoutingKey(lRkId, rc, null, null, dpcObj, servInds, null);
// As remAs = sgw.createAppServer("testas", rc, rKey, trModType);
AsImpl remAs = (AsImpl) serverM3UAMgmt.createAs("testas", Functionality.SGW, ExchangeType.SE, null, rc, trModType, 1,
null);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
serverM3UAMgmt.addRoute(dpc, opc, si, "testas");
FSM asLocalFSM = remAs.getLocalFSM();
// 2+0 sparing loadsharing
remAs.setMinAspActiveForLb(2);
AspFactoryImpl aspFactory1 = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp1", "testAssoc1", false);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactory1 }, m3uaManagementEventsSeq++)));
AspFactoryImpl aspFactory2 = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp2", "testAssoc2", false);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactory2 }, m3uaManagementEventsSeq++)));
AspImpl remAsp1 = serverM3UAMgmt.assignAspToAs("testas", "testasp1");
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs, remAsp1 }, m3uaManagementEventsSeq++)));
AspImpl remAsp2 = serverM3UAMgmt.assignAspToAs("testas", "testasp2");
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs, remAsp2 }, m3uaManagementEventsSeq++)));
FSM aspPeerFSM1 = remAsp1.getPeerFSM();
FSM aspPeerFSM2 = remAsp2.getPeerFSM();
// Check for Communication UP for ASP1
testAssociation1.signalCommUp();
assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM1));
// Check for Communication UP for ASP2
testAssociation2.signalCommUp();
assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM2));
// Check for ASP_UP for ASP1
M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
aspFactory1.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM1));
assertEquals(remAsp1.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsInactive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
// Check for ASP_UP for ASP2
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
aspFactory2.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM2));
assertEquals(remAsp2.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp2 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation2, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
// AS is still INACTIVE
assertEquals(AsState.INACTIVE, this.getAsState(asLocalFSM));
assertEquals(remAs.getState().getName(), State.STATE_INACTIVE);
assertTrue(validateMessage(testAssociation2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
// Check for ASP_ACTIVE for ASP1
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
((ASPActiveImpl) message).setRoutingContext(rc);
aspFactory1.read(message);
assertEquals(AspState.ACTIVE, this.getAspState(aspPeerFSM1));
assertEquals(remAsp1.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
// But AS still INACTIVE as atleast 2 ASP's should be ACTIVE
assertEquals(AsState.INACTIVE, this.getAsState(asLocalFSM));
assertEquals(remAs.getState().getName(), State.STATE_INACTIVE);
// Check for ASP_ACTIVE for ASP2
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
((ASPActiveImpl) message).setRoutingContext(rc);
aspFactory2.read(message);
assertEquals(AspState.ACTIVE, this.getAspState(aspPeerFSM2));
assertEquals(remAsp2.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp2 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation2, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
// Now AS will be ACTIVE and send NTFY to both the ASP's
assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM));
assertEquals(remAs.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsActive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
assertTrue(validateMessage(testAssociation2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
// Send Transfer Message and check load balancing behavior
// int si, int ni, int mp, int opc, int dpc, int sls, byte[] data,
// RoutingLabelFormat pointCodeFormat
for (int sls = 0; sls < 256; sls++) {
Mtp3TransferPrimitive mtp3TransferPrimitive = factory.createMtp3TransferPrimitive(3, 1, 0, 1, 2, sls, new byte[] {
1, 2, 3, 4 });
serverM3UAMgmt.sendMessage(mtp3TransferPrimitive);
}
for (int count = 0; count < 128; count++) {
assertTrue(validateMessage(testAssociation1, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
}
for (int count = 0; count < 128; count++) {
assertTrue(validateMessage(testAssociation2, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
}
// INACTIVATE ASP1.But AS remains ACTIVE in any case
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
((ASPInactiveImpl) message).setRoutingContext(rc);
aspFactory1.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM1));
assertEquals(remAsp1.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1, -1));
// ASP1 also receives NTFY Ins ASP Resource as we have fallen bellow
// threshold
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_Other,
Status.INFO_Insufficient_ASP_Resources_Active));
// AS remains ACTIVE
assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM));
assertEquals(remAs.getState().getName(), State.STATE_ACTIVE);
// PAYLOAD all goes through ASP2
// int si, int ni, int mp, int opc, int dpc, int sls, byte[] data,
// RoutingLabelFormat pointCodeFormat
for (int sls = 0; sls < 256; sls++) {
Mtp3TransferPrimitive mtp3TransferPrimitive = factory.createMtp3TransferPrimitive(3, 1, 0, 1, 2, sls, new byte[] {
1, 2, 3, 4 });
serverM3UAMgmt.sendMessage(mtp3TransferPrimitive);
}
for (int count = 0; count < 256; count++) {
assertTrue(validateMessage(testAssociation2, MessageClass.TRANSFER_MESSAGES, MessageType.PAYLOAD, -1, -1));
}
// Bring down ASP1
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactory1.read(message);
assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM1));
assertEquals(remAsp1.getState().getName(), State.STATE_DOWN);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspDown, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK, -1, -1));
assertNull(testAssociation1.txPoll());
// AS remains ACTIVE
assertEquals(AsState.ACTIVE, this.getAsState(asLocalFSM));
assertEquals(remAs.getState().getName(), State.STATE_ACTIVE);
// INACTIVATE ASP2.Now AS becomes PENDING and sends NTFY to all ASP's in
// INACTIVE state
message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
((ASPInactiveImpl) message).setRoutingContext(rc);
aspFactory2.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM2));
assertEquals(remAsp2.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp2 }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation2, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1, -1));
// AS becomes PENDING
assertEquals(AsState.PENDING, this.getAsState(asLocalFSM));
assertEquals(remAs.getState().getName(), State.STATE_PENDING);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsPending, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
// AS state change NTFY message
assertTrue(validateMessage(testAssociation2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
assertNull(testAssociation1.txPoll());
assertNull(testAssociation2.txPoll());
// Bring down ASP2
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactory2.read(message);
}
@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 });
DestinationPointCode[] dpc = new DestinationPointCode[] { parmFactory.createDestinationPointCode(123, (short) 0) };
ServiceIndicators[] servInds = new ServiceIndicators[] { parmFactory.createServiceIndicators(new short[] { 3 }) };
TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Override);
LocalRKIdentifier lRkId = parmFactory.createLocalRKIdentifier(1);
RoutingKey rKey = parmFactory.createRoutingKey(lRkId, rc, null, null, dpc, servInds, null);
// As remAs = sgw.createAppServer("testas", rc, rKey, trModType);
AsImpl remAs = (AsImpl) serverM3UAMgmt.createAs("testas", Functionality.SGW, ExchangeType.SE, null, rc, trModType, 1,
null);
// AspFactory aspFactory = sgw.createAspFactory("testasp", "127.0.0.1",
// 2777);
AspFactoryImpl aspFactoryImpl = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp", "testAssoc1", false);
AspImpl remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp");
FSM aspPeerFSM = remAsp.getPeerFSM();
FSM asLocalFSM = remAs.getLocalFSM();
// Check for Communication UP
testAssociation1.signalCommUp();
assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM));
// Check for 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));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
// 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));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
// Check for ASP_UP received while ASP is already UP
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));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
// Make sure we don't have any more
assertNull(testAssociation1.txPoll());
// Bring down ASP
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactoryImpl.read(message);
}
@Test
public void testPendingQueue() throws Exception {
int m3uaManagementEventsSeq = 0;
TestAssociation testAssociation1 = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0,
"testAssoc1");
RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 });
DestinationPointCode[] dpc = new DestinationPointCode[] { parmFactory.createDestinationPointCode(123, (short) 0) };
ServiceIndicators[] servInds = new ServiceIndicators[] { parmFactory.createServiceIndicators(new short[] { 3 }) };
TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Override);
LocalRKIdentifier lRkId = parmFactory.createLocalRKIdentifier(1);
RoutingKey rKey = parmFactory.createRoutingKey(lRkId, rc, null, null, dpc, servInds, null);
AsImpl remAs = (AsImpl) serverM3UAMgmt.createAs("testas", Functionality.SGW, ExchangeType.SE, null, rc, trModType, 1,
null);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
FSM asLocalFSM = remAs.getLocalFSM();
AspFactoryImpl aspFactoryImpl = (AspFactoryImpl) serverM3UAMgmt.createAspFactory("testasp", "testAssoc1", false);
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactoryImpl }, m3uaManagementEventsSeq++)));
AspImpl remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp");
// Check if M3UAManagementEventListener received event
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs, remAsp }, m3uaManagementEventsSeq++)));
FSM aspPeerFSM = remAsp.getPeerFSM();
// Check for Communication UP
testAssociation1.signalCommUp();
assertEquals(AspState.DOWN, this.getAspState(aspPeerFSM));
// Check for ASP_UP
M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
aspFactoryImpl.read(message);
assertEquals(AspState.INACTIVE, this.getAspState(aspPeerFSM));
assertEquals(remAsp.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsInactive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
// 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));
assertEquals(remAsp.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsActive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
// 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));
assertEquals(remAsp.getState().getName(), State.STATE_INACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspInactive, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_PENDING);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsPending, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
// 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);
assertEquals(AspState.ACTIVE, this.getAspState(aspPeerFSM));
assertEquals(remAsp.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp }, m3uaManagementEventsSeq++)));
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));
assertEquals(remAs.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsActive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));
assertTrue(validateMessage(testAssociation1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
// Also we should have PayloadData
M3UAMessage payLoadTemp = testAssociation1.txPoll();
assertNotNull(payLoadTemp);
assertEquals(MessageClass.TRANSFER_MESSAGES, payLoadTemp.getMessageClass());
assertEquals(MessageType.PAYLOAD, payLoadTemp.getMessageType());
// Make sure we don't have any more
assertNull(testAssociation1.txPoll());
// Bring down ASP
message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
aspFactoryImpl.read(message);
}
/**
*
* @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();
}
void clearRxMessages() {
this.messageRxFromUserPart.clear();
}
@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;
}
/*
* (non-Javadoc)
*
* @see org.mobicents.protocols.api.Association#getExtraHostAddresses()
*/
@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();
}
}
private class M3UAManagementEventListenerImpl implements M3UAManagementEventListener {
private FastList<TestEvent> testEvents = new FastList<TestEvent>();
private int sequence = 0;
@Override
public void onAsCreated(As as) {
TestEvent testEvent = new TestEvent(TestEventType.AsCreated, System.currentTimeMillis(), new Object[] { as },
sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAsDestroyed(As as) {
TestEvent testEvent = new TestEvent(TestEventType.AsDestroyed, System.currentTimeMillis(), new Object[] { as },
sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAspFactoryCreated(AspFactory aspFactory) {
TestEvent testEvent = new TestEvent(TestEventType.AspFactoryCreated, System.currentTimeMillis(),
new Object[] { aspFactory }, sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAspFactoryDestroyed(AspFactory aspFactory) {
TestEvent testEvent = new TestEvent(TestEventType.AspFactoryDestroyed, System.currentTimeMillis(),
new Object[] { aspFactory }, sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAspAssignedToAs(As as, Asp asp) {
TestEvent testEvent = new TestEvent(TestEventType.AspAssignedToAs, System.currentTimeMillis(), new Object[] { as,
asp }, sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAspUnassignedFromAs(As as, Asp asp) {
TestEvent testEvent = new TestEvent(TestEventType.AspUnassignedFromAs, System.currentTimeMillis(), new Object[] {
as, asp }, sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onRemoveAllResources() {
TestEvent testEvent = new TestEvent(TestEventType.RemoveAllResources, System.currentTimeMillis(), null, sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAspFactoryStarted(AspFactory aspFactory) {
TestEvent testEvent = new TestEvent(TestEventType.AspFactoryStarted, System.currentTimeMillis(),
new Object[] { aspFactory }, sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAspFactoryStopped(AspFactory aspFactory) {
TestEvent testEvent = new TestEvent(TestEventType.AspFactoryStopped, System.currentTimeMillis(),
new Object[] { aspFactory }, sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAspActive(Asp asp, State oldState) {
TestEvent testEvent = new TestEvent(TestEventType.AspActive, System.currentTimeMillis(), new Object[] { asp },
sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAspInactive(Asp asp, State oldState) {
TestEvent testEvent = new TestEvent(TestEventType.AspInactive, System.currentTimeMillis(), new Object[] { asp },
sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAspDown(Asp asp, State oldState) {
TestEvent testEvent = new TestEvent(TestEventType.AspDown, System.currentTimeMillis(), new Object[] { asp },
sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAsActive(As as, State oldState) {
TestEvent testEvent = new TestEvent(TestEventType.AsActive, System.currentTimeMillis(), new Object[] { as },
sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAsPending(As as, State oldState) {
TestEvent testEvent = new TestEvent(TestEventType.AsPending, System.currentTimeMillis(), new Object[] { as },
sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAsInactive(As as, State oldState) {
TestEvent testEvent = new TestEvent(TestEventType.AsInactive, System.currentTimeMillis(), new Object[] { as },
sequence++);
this.testEvents.add(testEvent);
}
@Override
public void onAsDown(As as, State oldState) {
TestEvent testEvent = new TestEvent(TestEventType.AsDown, System.currentTimeMillis(), new Object[] { as },
sequence++);
this.testEvents.add(testEvent);
}
public boolean validateEvent(TestEvent testEventExpected) {
TestEvent testEventActual = this.testEvents.removeFirst();
if (testEventActual == null) {
return false;
}
return testEventExpected.equals(testEventActual);
}
@Override
public void onServiceStarted() {
// TODO Auto-generated method stub
}
@Override
public void onServiceStopped() {
// TODO Auto-generated method stub
}
}
}