/*
* 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.isup.impl.stack.timers;
import java.util.ArrayList;
import java.util.List;
import org.mobicents.protocols.ss7.isup.ISUPEvent;
import org.mobicents.protocols.ss7.isup.ISUPTimeoutEvent;
import org.mobicents.protocols.ss7.isup.message.ISUPMessage;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
/**
* @author baranowb
*
*/
public abstract class DoubleTimers extends EventTestHarness {
// smaller timer - ie. T16
protected long SMALLER_T;
protected int SMALLER_T_ID;
// bigger timer - ie. T17
protected long BIGGER_T;
protected int BIGGER_T_ID;
protected long numOfTimeouts;
// ie. RSC - T16 & T17
protected ISUPMessage request; // message exchanged within
protected ISUPMessage answer;
@BeforeClass
public void setUp() throws Exception {
super.setUp();
this.SMALLER_T = getSmallerT();
this.BIGGER_T = getBiggerT();
this.SMALLER_T_ID = getSmallerT_ID();
this.BIGGER_T_ID = getBiggerT_ID();
if (BIGGER_T % SMALLER_T == 0)
this.numOfTimeouts = BIGGER_T / SMALLER_T - 1;
else
this.numOfTimeouts = BIGGER_T / SMALLER_T;
this.request = getRequest();
this.answer = getAnswer();
}
@AfterClass
public void tearDown() throws Exception {
super.provider.removeListener(this);
super.tearDown();
}
protected abstract long getSmallerT();
protected abstract long getBiggerT();
// IDS
protected abstract int getSmallerT_ID();
protected abstract int getBiggerT_ID();
/**
* return request sent after big timer hits, in most cases its orignial.
*
* @return
*/
protected ISUPMessage getAfterBigTRequest() {
return getRequest();
}
// @Test(groups = { "functional.timer","timer.timeout.big"})
public void testBigTimeout() throws Exception {
// add expected events on remote and local end
List<EventReceived> expectedRemoteEventsReceived = new ArrayList<EventReceived>();
List<EventReceived> expectedLocalEvents = new ArrayList<EventReceived>();
long startTStamp = System.currentTimeMillis();
this.provider.sendMessage(this.request, dpc);
MessageEventReceived eventReceived = new MessageEventReceived(startTStamp, new ISUPEvent(super.provider, this.request,
dpc));
expectedRemoteEventsReceived.add(eventReceived);
// now lets create events we expect to be received by local and remote.
int count = 0;
while (count != this.numOfTimeouts) {
long eventtStamp = startTStamp + (count + 1) * SMALLER_T;
ISUPTimeoutEvent timeoutEvent = new ISUPTimeoutEvent(super.provider, this.request, SMALLER_T_ID, dpc);
TimeoutEventReceived ter = new TimeoutEventReceived(eventtStamp, timeoutEvent);
expectedLocalEvents.add(ter);
ISUPEvent event = new ISUPEvent(super.provider, this.request, dpc);
eventReceived = new MessageEventReceived(eventtStamp, event);
expectedRemoteEventsReceived.add(eventReceived);
count++;
}
// and one with tstamp for ie. T17 timeout.
ISUPTimeoutEvent timeoutEvent = new ISUPTimeoutEvent(super.provider, this.request, BIGGER_T_ID, dpc);
TimeoutEventReceived ter = new TimeoutEventReceived(startTStamp + BIGGER_T, timeoutEvent);
expectedLocalEvents.add(ter);
ISUPEvent event = new ISUPEvent(super.provider, getAfterBigTRequest(), dpc);
eventReceived = new MessageEventReceived(startTStamp + BIGGER_T, event);
expectedRemoteEventsReceived.add(eventReceived);
// now wait
doWait(BIGGER_T + 500);
// stop stack
stack.stop();
// now make compare
super.compareEvents(expectedLocalEvents, expectedRemoteEventsReceived);
}
// @Test(groups = { "functional.timer","timer.timeout.big.answer"})
public void testBigTimeoutWithAnswer() throws Exception {
// add expected events on remote and local end
List<EventReceived> expectedRemoteEventsReceived = new ArrayList<EventReceived>();
List<EventReceived> expectedLocalEvents = new ArrayList<EventReceived>();
long startTStamp = System.currentTimeMillis();
this.provider.sendMessage(this.request, dpc);
MessageEventReceived eventReceived = new MessageEventReceived(startTStamp, new ISUPEvent(super.provider, this.request,
dpc));
expectedRemoteEventsReceived.add(eventReceived);
// now lets create events we expect to be received by local and remote.
int count = 0;
while (count != this.numOfTimeouts) {
long eventtStamp = startTStamp + (count + 1) * SMALLER_T;
ISUPTimeoutEvent timeoutEvent = new ISUPTimeoutEvent(super.provider, this.request, SMALLER_T_ID, dpc);
TimeoutEventReceived ter = new TimeoutEventReceived(eventtStamp, timeoutEvent);
expectedLocalEvents.add(ter);
ISUPEvent event = new ISUPEvent(super.provider, this.request, dpc);
eventReceived = new MessageEventReceived(eventtStamp, event);
expectedRemoteEventsReceived.add(eventReceived);
count++;
}
// and one with tstamp for ie. T17 timeout.
ISUPTimeoutEvent timeoutEvent = new ISUPTimeoutEvent(super.provider, this.request, BIGGER_T_ID, dpc);
TimeoutEventReceived ter = new TimeoutEventReceived(startTStamp + BIGGER_T, timeoutEvent);
expectedLocalEvents.add(ter);
ISUPEvent event = new ISUPEvent(super.provider, getAfterBigTRequest(), dpc);
eventReceived = new MessageEventReceived(startTStamp + BIGGER_T, event);
expectedRemoteEventsReceived.add(eventReceived);
// now wait
doWait(BIGGER_T + 500);
long tstamp = System.currentTimeMillis();
doAnswer();
event = new ISUPEvent(super.provider, this.answer, dpc);
eventReceived = new MessageEventReceived(tstamp, event);
expectedLocalEvents.add(eventReceived);
doWait(1000);
// stop stack
stack.stop();
// now make compare
super.compareEvents(expectedLocalEvents, expectedRemoteEventsReceived);
}
// @Test(groups = { "functional.timer","timer.timeout.big.woanswer"})
public void testSmallTimeoutWithAnswer() throws Exception {
// add expected events on remote and local end
List<EventReceived> expectedRemoteEventsReceived = new ArrayList<EventReceived>();
List<EventReceived> expectedLocalEvents = new ArrayList<EventReceived>();
long startTStamp = System.currentTimeMillis();
this.provider.sendMessage(this.request, dpc);
MessageEventReceived eventReceived = new MessageEventReceived(startTStamp, new ISUPEvent(super.provider, this.request,
dpc));
expectedRemoteEventsReceived.add(eventReceived);
// now lets create events we expect to be received by local and remote.
long eventtStamp = startTStamp * SMALLER_T;
ISUPTimeoutEvent timeoutEvent = new ISUPTimeoutEvent(super.provider, this.request, SMALLER_T_ID, dpc);
TimeoutEventReceived ter = new TimeoutEventReceived(eventtStamp, timeoutEvent);
expectedLocalEvents.add(ter);
ISUPEvent event = new ISUPEvent(super.provider, this.request, dpc);
eventReceived = new MessageEventReceived(eventtStamp, event);
expectedRemoteEventsReceived.add(eventReceived);
// now wait
doWait(SMALLER_T + 500); // 500 should be good even here.
long tstamp = System.currentTimeMillis();
doAnswer();
event = new ISUPEvent(super.provider, this.answer, dpc);
eventReceived = new MessageEventReceived(tstamp, event);
expectedLocalEvents.add(eventReceived);
doWait(1000);
// now make compare
// stop stack
stack.stop();
super.compareEvents(expectedLocalEvents, expectedRemoteEventsReceived);
}
// @Test(groups = { "functional.timer","timer.answer"})
public void testNoTimeoutWithAnswer() throws Exception {
// add expected events on remote and local end
List<EventReceived> expectedRemoteEventsReceived = new ArrayList<EventReceived>();
List<EventReceived> expectedLocalEvents = new ArrayList<EventReceived>();
this.provider.sendMessage(this.request, dpc);
MessageEventReceived eventReceived = new MessageEventReceived(System.currentTimeMillis(), new ISUPEvent(super.provider,
this.request, dpc));
expectedRemoteEventsReceived.add(eventReceived);
// now wait
doWait(SMALLER_T / 2);
long tstamp = System.currentTimeMillis();
doAnswer();
ISUPEvent event = new ISUPEvent(super.provider, this.answer, dpc);
eventReceived = new MessageEventReceived(tstamp, event);
expectedLocalEvents.add(eventReceived);
doWait(1000);
// now make compare
// stop stack
stack.stop();
super.compareEvents(expectedLocalEvents, expectedRemoteEventsReceived);
}
}