/* * TeleStax, Open Source Cloud Communications Copyright 2012. * 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.sccp.impl.messageflow; import org.mobicents.protocols.ss7.Util; import org.mobicents.protocols.ss7.indicator.RoutingIndicator; import org.mobicents.protocols.ss7.sccp.LoadSharingAlgorithm; import org.mobicents.protocols.ss7.sccp.OriginationType; import org.mobicents.protocols.ss7.sccp.RuleType; import org.mobicents.protocols.ss7.sccp.impl.Mtp3UserPartImpl; import org.mobicents.protocols.ss7.sccp.impl.SccpHarness; import org.mobicents.protocols.ss7.sccp.impl.SccpStackImpl; import org.mobicents.protocols.ss7.sccp.impl.SccpStackImplProxy; import org.mobicents.protocols.ss7.sccp.impl.User; import org.mobicents.protocols.ss7.sccp.message.SccpDataMessage; import org.mobicents.protocols.ss7.sccp.parameter.SccpAddress; 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; import static org.testng.Assert.assertEquals; /** * * @author sergey vetyutnev * */ public class LoadSharingTest extends SccpHarness { private SccpAddress a1, a2; protected Mtp3UserPartImpl mtp3UserPart11 = new Mtp3UserPartImpl(); public LoadSharingTest() { } @BeforeClass public void setUpClass() throws Exception { this.sccpStack1Name = "LoadSharingTestStack1"; this.sccpStack2Name = "LoadSharingTestStack2"; } @AfterClass public void tearDownClass() throws Exception { } protected void createStack1() { sccpStack1 = createStack(sccpStack1Name); sccpStack1.setMtp3UserPart(2, mtp3UserPart11); sccpProvider1 = sccpStack1.getSccpProvider(); } protected void createStack2() { sccpStack2 = createStack(sccpStack2Name); sccpProvider2 = sccpStack2.getSccpProvider(); } @Override protected SccpStackImpl createStack(String name) { SccpStackImpl stack = new SccpStackImplProxy(name); final String dir = Util.getTmpTestDir(); if (dir != null) { stack.setPersistDir(dir); } return stack; } @BeforeMethod public void setUp() throws Exception { super.setUp(); sccpStack1.getRouter().addMtp3ServiceAccessPoint(2, 2, 11, 2, 0); sccpStack1.getRouter().addMtp3Destination(2, 1, 12, 12, 0, 255, 255); resource1.addRemoteSpc(2, 12, 0, 0); resource1.addRemoteSsn(2, 12, getSSN(), 0, false); } @AfterMethod public void tearDown() { super.tearDown(); } public byte[] getDataSrc() { return new byte[] { 11, 12, 13, 14, 15 }; } @Test(groups = { "SccpMessage", "functional.transfer" }) public void testTransfer() throws Exception { a1 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, null, getStack1PC(), 8); a2 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, null, getStack2PC(), 8); User u1 = new User(sccpStack1.getSccpProvider(), a1, a2, getSSN()); User u2 = new User(sccpStack2.getSccpProvider(), a2, a1, getSSN()); u1.register(); u2.register(); Thread.sleep(100); // Seriously, cant you reuse address ? CMON! SccpAddress primaryAddress = sccpProvider1.getParameterFactory().createSccpAddress( RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), getStack2PC(), 8); sccpStack1.getRouter().addRoutingAddress(1, primaryAddress); // primaryAddress2 - with ssn==0, so we will get ssn from the message CalledPartyAddress SccpAddress primaryAddress2 = sccpProvider1.getParameterFactory().createSccpAddress( RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), getStack2PC(), 0); sccpStack1.getRouter().addRoutingAddress(2, primaryAddress2); SccpAddress backupAddress = sccpProvider1.getParameterFactory().createSccpAddress( RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 12, 8); sccpStack1.getRouter().addRoutingAddress(3, backupAddress); // sccpStack1.getRouter().addBackupAddress(1, backupAddress); // ---- Solitary case SccpAddress pattern = sccpProvider1.getParameterFactory().createSccpAddress( RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); // pattern2 - with default ssn value SccpAddress pattern2 = sccpProvider1.getParameterFactory().createSccpAddress( RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("222222", 1), 0, 0); sccpStack1.getRouter().addRule(1, RuleType.SOLITARY, LoadSharingAlgorithm.Undefined, OriginationType.ALL, pattern, "K", 1, -1, null, 0,null); // Primary and backup are available SccpAddress a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); SccpDataMessage message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 0); assertEquals(u2.getMessages().size(), 1); assertEquals(mtp3UserPart11.getMessages().size(), 0); // Primary is available backup is disabled this.mtp3UserPart1.sendPauseMessageToLocalUser(12); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 0); assertEquals(u2.getMessages().size(), 2); assertEquals(mtp3UserPart11.getMessages().size(), 0); // Primary is disabled backup is available this.mtp3UserPart1.sendResumeMessageToLocalUser(12); this.mtp3UserPart1.sendPauseMessageToLocalUser(getStack2PC()); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 1); assertEquals(u2.getMessages().size(), 2); assertEquals(mtp3UserPart11.getMessages().size(), 0); // Primary and backup are disabled this.mtp3UserPart1.sendPauseMessageToLocalUser(12); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 2); assertEquals(u2.getMessages().size(), 2); assertEquals(mtp3UserPart11.getMessages().size(), 0); this.mtp3UserPart1.sendResumeMessageToLocalUser(12); this.mtp3UserPart1.sendResumeMessageToLocalUser(getStack2PC()); Thread.sleep(100); // ---- Dominant case sccpStack1.getRouter().removeRule(1); sccpStack1.getRouter().addRule(1, RuleType.DOMINANT, LoadSharingAlgorithm.Undefined, OriginationType.ALL, pattern, "K", 1, 3, null, 0, null); // Primary and backup are available a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 2); assertEquals(u2.getMessages().size(), 3); assertEquals(mtp3UserPart11.getMessages().size(), 0); // Primary is available backup is disabled this.mtp3UserPart1.sendPauseMessageToLocalUser(12); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 2); assertEquals(u2.getMessages().size(), 4); assertEquals(mtp3UserPart11.getMessages().size(), 0); // Primary is disabled backup is available this.mtp3UserPart1.sendResumeMessageToLocalUser(12); this.mtp3UserPart1.sendPauseMessageToLocalUser(getStack2PC()); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 2); assertEquals(u2.getMessages().size(), 4); assertEquals(mtp3UserPart11.getMessages().size(), 1); // Primary and backup are disabled this.mtp3UserPart1.sendPauseMessageToLocalUser(12); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 3); assertEquals(u2.getMessages().size(), 4); assertEquals(mtp3UserPart11.getMessages().size(), 1); this.mtp3UserPart1.sendResumeMessageToLocalUser(12); this.mtp3UserPart1.sendResumeMessageToLocalUser(getStack2PC()); Thread.sleep(100); // ---- Loadshared case sccpStack1.getRouter().removeRule(1); sccpStack1.getRouter().addRule(1, RuleType.LOADSHARED, LoadSharingAlgorithm.Bit4, OriginationType.ALL, pattern, "K", 1, 3, null, 0, null); // rule which primaryAddress ssn==0 (getting ssn from origin CalledPartyAddress) sccpStack1.getRouter().addRule(2, RuleType.LOADSHARED, LoadSharingAlgorithm.Bit4, OriginationType.ALL, pattern2, "K", 2, 3, null, 0, null); // Primary and backup are available // - class 1 (route by sls): sls = 0xEF: primary route (sls & 0x10 rule) a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0xEF, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 3); assertEquals(u2.getMessages().size(), 5); assertEquals(mtp3UserPart11.getMessages().size(), 1); // - class 1 (route by sls): sls = 0xFF: backup route (sls & 0x10 rule) a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0xFF, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 3); assertEquals(u2.getMessages().size(), 5); assertEquals(mtp3UserPart11.getMessages().size(), 2); // - class 0: first message is for primary route a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass0(a3, a1, getDataSrc(), 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 3); assertEquals(u2.getMessages().size(), 6); assertEquals(mtp3UserPart11.getMessages().size(), 2); // - class 0: second message is for backup route a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass0(a3, a1, getDataSrc(), 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 3); assertEquals(u2.getMessages().size(), 6); assertEquals(mtp3UserPart11.getMessages().size(), 3); // Primary is available backup is disabled this.mtp3UserPart1.sendPauseMessageToLocalUser(12); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 3); assertEquals(u2.getMessages().size(), 7); assertEquals(mtp3UserPart11.getMessages().size(), 3); // Primary is available backup is disabled + CalledPartyAddress has SSN + primaryAddress has not SSN (SSN is taken from // CalledPartyAddress) SccpAddress a3_2 = sccpProvider1.getParameterFactory().createSccpAddress( RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("222222", 1), 0, 8); message = this.sccpProvider1.getMessageFactory() .createDataMessageClass1(a3_2, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 3); assertEquals(u2.getMessages().size(), 8); assertEquals(mtp3UserPart11.getMessages().size(), 3); // Primary is disabled backup is available this.mtp3UserPart1.sendResumeMessageToLocalUser(12); this.mtp3UserPart1.sendPauseMessageToLocalUser(getStack2PC()); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 3); assertEquals(u2.getMessages().size(), 8); assertEquals(mtp3UserPart11.getMessages().size(), 4); // Primary and backup are disabled this.mtp3UserPart1.sendPauseMessageToLocalUser(12); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 4); assertEquals(u2.getMessages().size(), 8); assertEquals(mtp3UserPart11.getMessages().size(), 4); this.mtp3UserPart1.sendResumeMessageToLocalUser(12); this.mtp3UserPart1.sendResumeMessageToLocalUser(getStack2PC()); Thread.sleep(100); // ---- Broadcast case sccpStack1.getRouter().removeRule(1); sccpStack1.getRouter().removeRule(2); sccpStack1.getRouter().addRule(1, RuleType.BROADCAST, LoadSharingAlgorithm.Undefined, OriginationType.ALL, pattern, "K", 1, 3, null, 0, null); // Primary and backup are available a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 4); assertEquals(u2.getMessages().size(), 9); assertEquals(mtp3UserPart11.getMessages().size(), 5); // Primary is available backup is disabled this.mtp3UserPart1.sendPauseMessageToLocalUser(12); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 4); assertEquals(u2.getMessages().size(), 10); assertEquals(mtp3UserPart11.getMessages().size(), 5); // Primary is disabled backup is available this.mtp3UserPart1.sendResumeMessageToLocalUser(12); this.mtp3UserPart1.sendPauseMessageToLocalUser(getStack2PC()); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 4); assertEquals(u2.getMessages().size(), 10); assertEquals(mtp3UserPart11.getMessages().size(), 6); // Primary and backup are disabled this.mtp3UserPart1.sendPauseMessageToLocalUser(12); Thread.sleep(100); a3 = sccpProvider1.getParameterFactory().createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, sccpProvider1.getParameterFactory().createGlobalTitle("111111", 1), 0, 0); message = this.sccpProvider1.getMessageFactory().createDataMessageClass1(a3, a1, getDataSrc(), 0, 8, true, null, null); sccpProvider1.send(message); Thread.sleep(100); assertEquals(u1.getMessages().size(), 5); assertEquals(u2.getMessages().size(), 10); assertEquals(mtp3UserPart11.getMessages().size(), 6); this.mtp3UserPart1.sendResumeMessageToLocalUser(12); this.mtp3UserPart1.sendResumeMessageToLocalUser(getStack2PC()); Thread.sleep(100); } }