Skip to content

Commit

Permalink
Fixing of #219: M3UA handling of Two ASPs in an Application Server
Browse files Browse the repository at this point in the history
(update from Amit)
  • Loading branch information
vetss committed Apr 3, 2017
1 parent dd4328e commit 73e9fc3
Show file tree
Hide file tree
Showing 2 changed files with 131 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,8 @@ private void initPeerFSM() {
this.peerFSM.createTransition(TransitionState.AS_STATE_CHANGE_INACTIVE, AsState.DOWN.toString(),
AsState.INACTIVE.toString());
this.peerFSM.createTransition(TransitionState.ASP_DOWN, AsState.DOWN.toString(), AsState.DOWN.toString());

this.peerFSM.createTransition(TransitionState.AS_STATE_CHANGE_ACTIVE, AsState.DOWN.toString(),
AsState.ACTIVE.toString()).setHandler(new THPeerAsInActToAct(this, this.peerFSM));

This comment has been minimized.

Copy link
@jaimecasero

jaimecasero Apr 3, 2017

the real power of FSMs is in maintenance phase, one additional transition, a one-liner full Spec feature impl i!!! amazing!!!! congrats @abhayani

// ******************************************************************/
// STATE INACTIVE /
// ******************************************************************/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1105,6 +1105,135 @@ public void testTwoAspInAsOverride() throws Exception {
aspFactory2.read(message);

}

@Test
public void testTwoAspInAsLoadShareDifferentAs() throws Exception {
// 5.1.3. Two ASPs in an Application Server ("1+1" Sparing, Loadsharing Case)
// However in this case we are assuming AS are from different VM, and if AS NTFY(ACTIVE) received,
// ASP should accept and change status to start traffic
int m3uaManagementEventsSeq = 0;

TestAssociation testAssociation1 = (TestAssociation) this.transportManagement.addAssociation(null, 0, null, 0,
"testAssoc1");

RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 });

TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Loadshare);

// As remAs = rsgw.createAppServer("testas", rc, rKey, trModType);
AsImpl remAs = (AsImpl) this.clientM3UAMgmt.createAs("testas", Functionality.AS, ExchangeType.SE, null, rc, null, 1,
null);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsCreated, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));

AspFactoryImpl aspFactory1 = (AspFactoryImpl) this.clientM3UAMgmt.createAspFactory("testasp1", "testAssoc1", false);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspFactoryCreated, System
.currentTimeMillis(), new Object[] { aspFactory1 }, m3uaManagementEventsSeq++)));

// TODO : Use Management to start asp
aspFactory1.start();

AspImpl remAsp1 = clientM3UAMgmt.assignAspToAs("testas", "testasp1");
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspAssignedToAs, System
.currentTimeMillis(), new Object[] { remAs, remAsp1 }, m3uaManagementEventsSeq++)));

// Create Route
this.clientM3UAMgmt.addRoute(2, -1, -1, "testas");

FSM asp1LocalFSM = remAsp1.getLocalFSM();

assertNull(remAsp1.getPeerFSM());

// Check for Communication UP for ASP1
testAssociation1.signalCommUp();
assertEquals(AspState.UP_SENT, this.getAspState(asp1LocalFSM));
// ASP_UP should have been sent.
assertTrue(validateMessage(testAssociation1, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP, -1, -1));
// But AS is still Down
FSM asPeerFSM = remAs.getPeerFSM();

assertEquals(AsState.DOWN, this.getAsState(asPeerFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_DOWN);

// Far end send ASP_UP_ACK and NTFY
M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK);
aspFactory1.read(message);

assertEquals(AspState.ACTIVE_SENT, this.getAspState(asp1LocalFSM));
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_ACTIVE, -1, -1));

Notify notify = (Notify) messageFactory.createMessage(MessageClass.MANAGEMENT, MessageType.NOTIFY);
notify.setRoutingContext(rc);
Status status = parmFactory.createStatus(Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE);
notify.setStatus(status);
aspFactory1.read(notify);
// the AS1 should be ACTIVE
assertEquals(AsState.ACTIVE, this.getAsState(asPeerFSM));
assertEquals(remAs.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsActive, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));

// The other side will send ASP_ACTIVE_ACK and after that
// NTFY(AS-ACTIVE)
ASPActiveAck aspActiveAck = (ASPActiveAck) messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE,
MessageType.ASP_ACTIVE_ACK);
aspActiveAck.setRoutingContext(rc);
aspActiveAck.setTrafficModeType(trModType);
aspFactory1.read(aspActiveAck);

assertEquals(AspState.ACTIVE, this.getAspState(asp1LocalFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_ACTIVE);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspActive, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));


// Check if MTP3 RESUME received
// lets wait for 2second to receive the MTP3 primitive before giving up
semaphore.tryAcquire(5000, TimeUnit.MILLISECONDS);

This comment has been minimized.

Copy link
@jaimecasero

jaimecasero Apr 3, 2017

if this expected to raise an expecetion is full time is elapsed? I think no exception will be raise,unless some other interrupts the thread. I only see, sem.release when events are received in correspoding listener. Check if this is desired behavior, since the test will proceed its execution based on wrong assumptions...


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());

// Bring down ASP1
// 5.2.1. 1+1 Sparing, Withdrawal of ASP, Backup Override
testAssociation1.signalCommLost();
// the ASP is DOWN and AS goes in PENDING STATE
assertEquals(AspState.DOWN, this.getAspState(asp1LocalFSM));
assertEquals(remAsp1.getState().getName(), State.STATE_DOWN);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AspDown, System
.currentTimeMillis(), new Object[] { remAsp1 }, m3uaManagementEventsSeq++)));

assertEquals(AsState.PENDING, this.getAsState(asPeerFSM));
assertEquals(remAs.getState().getName(), State.STATE_PENDING);
assertTrue(this.m3uaManagementEventListenerImpl.validateEvent(new TestEvent(TestEventType.AsPending, System
.currentTimeMillis(), new Object[] { remAs }, m3uaManagementEventsSeq++)));

// We will not get Alternate ASP Active as this ASP's channel is dead
// The other side will send ASP_ACTIVE_ACK and after that
// NTFY(AS-ACTIVE)
aspActiveAck = (ASPActiveAck) messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE,
MessageType.ASP_ACTIVE_ACK);
aspActiveAck.setRoutingContext(rc);

assertNull(testAssociation1.txPoll());

// No more MTP3 Primitive or message
assertNull(this.mtp3UserPartListener.rxMtp3PrimitivePoll());
assertNull(this.mtp3UserPartListener.rxMtp3TransferPrimitivePoll());

// Lets stop ASP Factory
aspFactory1.stop();

This comment has been minimized.

Copy link
@jaimecasero

jaimecasero Apr 3, 2017

i think this cleanup logic isn ot part of test itself, and should be enforced on AfterTest section so factory is released even if test doesnt proceed as expected...



}

@Test
public void testPendingQueue() throws Exception {
Expand Down

0 comments on commit 73e9fc3

Please sign in to comment.