/protocols/ss7/m3ua/impl/src/test/java/org/mobicents/protocols/ss7/m3ua/impl/sg/SgFSMTest.java

http://mobicents.googlecode.com/ · Java · 757 lines · 468 code · 130 blank · 159 comment · 25 complexity · bf91a7dbe5f4cfdeb6f1e575d52e434d MD5 · raw file

  1. /*
  2. * JBoss, Home of Professional Open Source
  3. * Copyright 2011, Red Hat, Inc. and individual contributors
  4. * by the @authors tag. See the copyright.txt in the distribution for a
  5. * full listing of individual contributors.
  6. *
  7. * This is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU Lesser General Public License as
  9. * published by the Free Software Foundation; either version 2.1 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This software is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this software; if not, write to the Free
  19. * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20. * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  21. */
  22. package org.mobicents.protocols.ss7.m3ua.impl.sg;
  23. import static org.junit.Assert.assertEquals;
  24. import static org.junit.Assert.assertNotNull;
  25. import static org.junit.Assert.assertNull;
  26. import static org.junit.Assert.assertTrue;
  27. import java.io.IOException;
  28. import org.junit.After;
  29. import org.junit.AfterClass;
  30. import org.junit.Before;
  31. import org.junit.BeforeClass;
  32. import org.junit.Test;
  33. import org.mobicents.protocols.ss7.m3ua.impl.As;
  34. import org.mobicents.protocols.ss7.m3ua.impl.AsState;
  35. import org.mobicents.protocols.ss7.m3ua.impl.Asp;
  36. import org.mobicents.protocols.ss7.m3ua.impl.AspFactory;
  37. import org.mobicents.protocols.ss7.m3ua.impl.AspState;
  38. import org.mobicents.protocols.ss7.m3ua.impl.CommunicationListener.CommunicationState;
  39. import org.mobicents.protocols.ss7.m3ua.impl.message.M3UAMessageImpl;
  40. import org.mobicents.protocols.ss7.m3ua.impl.message.MessageFactoryImpl;
  41. import org.mobicents.protocols.ss7.m3ua.impl.message.asptm.ASPActiveImpl;
  42. import org.mobicents.protocols.ss7.m3ua.impl.message.asptm.ASPInactiveImpl;
  43. import org.mobicents.protocols.ss7.m3ua.impl.message.transfer.PayloadDataImpl;
  44. import org.mobicents.protocols.ss7.m3ua.impl.parameter.ParameterFactoryImpl;
  45. import org.mobicents.protocols.ss7.m3ua.impl.parameter.ProtocolDataImpl;
  46. import org.mobicents.protocols.ss7.m3ua.message.M3UAMessage;
  47. import org.mobicents.protocols.ss7.m3ua.message.MessageClass;
  48. import org.mobicents.protocols.ss7.m3ua.message.MessageType;
  49. import org.mobicents.protocols.ss7.m3ua.message.mgmt.Notify;
  50. import org.mobicents.protocols.ss7.m3ua.parameter.DestinationPointCode;
  51. import org.mobicents.protocols.ss7.m3ua.parameter.ErrorCode;
  52. import org.mobicents.protocols.ss7.m3ua.parameter.LocalRKIdentifier;
  53. import org.mobicents.protocols.ss7.m3ua.parameter.RoutingContext;
  54. import org.mobicents.protocols.ss7.m3ua.parameter.RoutingKey;
  55. import org.mobicents.protocols.ss7.m3ua.parameter.ServiceIndicators;
  56. import org.mobicents.protocols.ss7.m3ua.parameter.Status;
  57. import org.mobicents.protocols.ss7.m3ua.parameter.TrafficModeType;
  58. /**
  59. *
  60. * @author amit bhayani
  61. *
  62. */
  63. public class SgFSMTest {
  64. private ParameterFactoryImpl parmFactory = new ParameterFactoryImpl();
  65. private MessageFactoryImpl messageFactory = new MessageFactoryImpl();
  66. private ServerM3UAManagement serverM3UAMgmt = new ServerM3UAManagement();
  67. public SgFSMTest() {
  68. }
  69. @BeforeClass
  70. public static void setUpClass() throws Exception {
  71. }
  72. @AfterClass
  73. public static void tearDownClass() throws Exception {
  74. }
  75. @Before
  76. public void setUp() throws IOException {
  77. serverM3UAMgmt.start();
  78. }
  79. @After
  80. public void tearDown() throws IOException {
  81. serverM3UAMgmt.getAppServers().clear();
  82. serverM3UAMgmt.getAspfactories().clear();
  83. serverM3UAMgmt.stop();
  84. }
  85. @Test
  86. public void testSingleAspInAs() throws Exception {
  87. // 5.1.1. Single ASP in an Application Server ("1+0" sparing),
  88. RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 });
  89. DestinationPointCode[] dpc = new DestinationPointCode[] { parmFactory
  90. .createDestinationPointCode(123, (short) 0) };
  91. ServiceIndicators[] servInds = new ServiceIndicators[] { parmFactory.createServiceIndicators(new short[] { 3 }) };
  92. TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Override);
  93. LocalRKIdentifier lRkId = parmFactory.createLocalRKIdentifier(1);
  94. RoutingKey rKey = parmFactory.createRoutingKey(lRkId, rc, null, null, dpc, servInds, null);
  95. // As remAs = sgw.createAppServer("testas", rc, rKey, trModType);
  96. As remAs = serverM3UAMgmt.createAppServer("m3ua ras create rc 100 rk dpc 123 si 3 traffic-mode override testas"
  97. .split(" "));
  98. // AspFactory aspFactory = sgw.createAspFactory("testasp", "127.0.0.1",
  99. // 2777);
  100. AspFactory aspFactory = serverM3UAMgmt.createAspFactory("m3ua rasp create ip 127.0.0.1 port 2777 testasp"
  101. .split(" "));
  102. Asp remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp");
  103. // Check for Communication UP
  104. aspFactory.onCommStateChange(CommunicationState.UP);
  105. assertEquals(AspState.DOWN, remAsp.getState());
  106. // Check for ASP_UP
  107. M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
  108. aspFactory.read(message);
  109. assertEquals(AspState.INACTIVE, remAsp.getState());
  110. assertTrue(validateMessage(aspFactory, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
  111. // also the AS should be INACTIVE now
  112. assertEquals(AsState.INACTIVE, remAs.getState());
  113. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  114. Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
  115. // Check for ASP_ACTIVE
  116. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
  117. ((ASPActiveImpl) message).setRoutingContext(rc);
  118. aspFactory.read(message);
  119. assertEquals(AspState.ACTIVE, remAsp.getState());
  120. assertTrue(validateMessage(aspFactory, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
  121. // also the AS should be ACTIVE now
  122. assertEquals(AsState.ACTIVE, remAs.getState());
  123. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  124. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  125. // Check for ASP_INACTIVE
  126. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
  127. aspFactory.read(message);
  128. assertEquals(AspState.INACTIVE, remAsp.getState());
  129. assertTrue(validateMessage(aspFactory, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1,
  130. -1));
  131. // also the AS should be PENDING now
  132. assertEquals(AsState.PENDING, remAs.getState());
  133. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  134. Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
  135. // Check for ASP_DOWN
  136. message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
  137. aspFactory.read(message);
  138. assertEquals(AspState.DOWN, remAsp.getState());
  139. assertTrue(validateMessage(aspFactory, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK, -1, -1));
  140. // Make sure we don't have any more
  141. assertNull(aspFactory.txPoll());
  142. }
  143. @Test
  144. public void testSingleAspInMultipleAs() throws Exception {
  145. // 5.1.1.3. Single ASP in Multiple Application Servers (Each with "1+0"
  146. // Sparing)
  147. // Define 1st AS
  148. RoutingContext rc1 = parmFactory.createRoutingContext(new long[] { 100 });
  149. DestinationPointCode[] dpc1 = new DestinationPointCode[] { parmFactory.createDestinationPointCode(123,
  150. (short) 0) };
  151. ServiceIndicators[] servInds1 = new ServiceIndicators[] { parmFactory
  152. .createServiceIndicators(new short[] { 3 }) };
  153. TrafficModeType trModType1 = parmFactory.createTrafficModeType(TrafficModeType.Override);
  154. LocalRKIdentifier lRkId1 = parmFactory.createLocalRKIdentifier(1);
  155. RoutingKey rKey1 = parmFactory.createRoutingKey(lRkId1, rc1, null, null, dpc1, servInds1, null);
  156. // As remAs1 = sgw.createAppServer("testas1", rc1, rKey1, trModType1);
  157. As remAs1 = serverM3UAMgmt
  158. .createAppServer("m3ua ras create rc 100 rk dpc 123 si 3 traffic-mode override testas1".split(" "));
  159. // Define 2nd AS
  160. RoutingContext rc2 = parmFactory.createRoutingContext(new long[] { 200 });
  161. DestinationPointCode[] dpc2 = new DestinationPointCode[] { parmFactory.createDestinationPointCode(124,
  162. (short) 0) };
  163. ServiceIndicators[] servInds2 = new ServiceIndicators[] { parmFactory
  164. .createServiceIndicators(new short[] { 3 }) };
  165. TrafficModeType trModType2 = parmFactory.createTrafficModeType(TrafficModeType.Override);
  166. LocalRKIdentifier lRkId2 = parmFactory.createLocalRKIdentifier(1);
  167. RoutingKey rKey2 = parmFactory.createRoutingKey(lRkId2, rc2, null, null, dpc2, servInds2, null);
  168. // As remAs2 = sgw.createAppServer("testas2", rc2, rKey2, trModType2);
  169. As remAs2 = serverM3UAMgmt
  170. .createAppServer("m3ua ras create rc 200 rk dpc 124 si 3 traffic-mode override testas2".split(" "));
  171. // AspFactory aspFactory = sgw.createAspFactory("testasp", "127.0.0.1",
  172. // 2777);
  173. AspFactory aspFactory = serverM3UAMgmt.createAspFactory("m3ua rasp create ip 127.0.0.1 port 2777 testasp"
  174. .split(" "));
  175. // Both ASP uses same underlying M3UAChannel
  176. Asp remAsp1 = serverM3UAMgmt.assignAspToAs("testas1", "testasp");
  177. Asp remAsp2 = serverM3UAMgmt.assignAspToAs("testas2", "testasp");
  178. // Check for Communication UP
  179. aspFactory.onCommStateChange(CommunicationState.UP);
  180. assertEquals(AspState.DOWN, remAsp1.getState());
  181. assertEquals(AspState.DOWN, remAsp2.getState());
  182. // Both AS are yet DOWN
  183. assertEquals(AsState.DOWN, remAs1.getState());
  184. assertEquals(AsState.DOWN, remAs2.getState());
  185. // Check for ASP_UP
  186. M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
  187. aspFactory.read(message);
  188. assertEquals(AspState.INACTIVE, remAsp1.getState());
  189. assertEquals(AspState.INACTIVE, remAsp2.getState());
  190. assertTrue(validateMessage(aspFactory, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
  191. // also both the AS should be INACTIVE now
  192. assertEquals(AsState.INACTIVE, remAs1.getState());
  193. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  194. Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
  195. assertEquals(AsState.INACTIVE, remAs2.getState());
  196. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  197. Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
  198. // Check for ASP_ACTIVE for both Routing Contexts
  199. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
  200. ((ASPActiveImpl) message).setRoutingContext(this.parmFactory.createRoutingContext(new long[] { 100, 200 }));
  201. aspFactory.read(message);
  202. assertEquals(AspState.ACTIVE, remAsp1.getState());
  203. assertEquals(AspState.ACTIVE, remAsp2.getState());
  204. assertTrue(validateMessage(aspFactory, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
  205. // also both the AS should be ACTIVE now
  206. assertEquals(AsState.ACTIVE, remAs1.getState());
  207. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  208. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  209. // We will have two ACK's one each for each RC
  210. assertTrue(validateMessage(aspFactory, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
  211. assertEquals(AsState.ACTIVE, remAs2.getState());
  212. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  213. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  214. // Check for ASP_INACTIVE for ASP1
  215. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
  216. ((ASPInactiveImpl) message).setRoutingContext(this.parmFactory.createRoutingContext(new long[] { 100 }));
  217. aspFactory.read(message);
  218. assertEquals(AspState.INACTIVE, remAsp1.getState());
  219. // The ASP2 should still be ACTIVE as we sent ASP_INACTIVE only for 100
  220. // RC
  221. assertEquals(AspState.ACTIVE, remAsp2.getState());
  222. assertTrue(validateMessage(aspFactory, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1,
  223. -1));
  224. // AS1 should be PENDING now
  225. assertEquals(AsState.PENDING, remAs1.getState());
  226. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  227. Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
  228. // But AS2 is still ACTIVE
  229. assertEquals(AsState.ACTIVE, remAs2.getState());
  230. // Check for ASP_DOWN
  231. message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
  232. aspFactory.read(message);
  233. assertEquals(AspState.DOWN, remAsp1.getState());
  234. assertEquals(AspState.DOWN, remAsp2.getState());
  235. assertTrue(validateMessage(aspFactory, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK, -1, -1));
  236. // Make sure we don't have any more messages to be sent
  237. assertNull(aspFactory.txPoll());
  238. }
  239. @Test
  240. public void testTwoAspInAsOverride() throws Exception {
  241. // 5.1.2. Two ASPs in Application Server ("1+1" Sparing)
  242. RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 });
  243. DestinationPointCode[] dpc = new DestinationPointCode[] { parmFactory
  244. .createDestinationPointCode(123, (short) 0) };
  245. ServiceIndicators[] servInds = new ServiceIndicators[] { parmFactory.createServiceIndicators(new short[] { 3 }) };
  246. TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Override);
  247. LocalRKIdentifier lRkId = parmFactory.createLocalRKIdentifier(1);
  248. RoutingKey rKey = parmFactory.createRoutingKey(lRkId, rc, null, null, dpc, servInds, null);
  249. // As remAs = sgw.createAppServer("testas", rc, rKey, trModType);
  250. As remAs = serverM3UAMgmt.createAppServer("m3ua ras create rc 100 rk dpc 123 si 3 traffic-mode override testas"
  251. .split(" "));
  252. // AspFactory aspFactory1 = sgw.createAspFactory("testasp1",
  253. // "127.0.0.1", 2777);
  254. AspFactory aspFactory1 = serverM3UAMgmt.createAspFactory("m3ua rasp create ip 127.0.0.1 port 2777 testasp1"
  255. .split(" "));
  256. // AspFactory aspFactory2 = sgw.createAspFactory("testasp2",
  257. // "127.0.0.1", 2778);
  258. AspFactory aspFactory2 = serverM3UAMgmt.createAspFactory("m3ua rasp create ip 127.0.0.1 port 2778 testasp2"
  259. .split(" "));
  260. Asp remAsp1 = serverM3UAMgmt.assignAspToAs("testas", "testasp1");
  261. Asp remAsp2 = serverM3UAMgmt.assignAspToAs("testas", "testasp2");
  262. // Check for Communication UP for ASP1
  263. aspFactory1.onCommStateChange(CommunicationState.UP);
  264. assertEquals(AspState.DOWN, remAsp1.getState());
  265. // Check for Communication UP for ASP2
  266. aspFactory2.onCommStateChange(CommunicationState.UP);
  267. assertEquals(AspState.DOWN, remAsp2.getState());
  268. // Check for ASP_UP for ASP1
  269. M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
  270. aspFactory1.read(message);
  271. assertEquals(AspState.INACTIVE, remAsp1.getState());
  272. assertTrue(validateMessage(aspFactory1, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
  273. // also the AS should be INACTIVE now
  274. assertEquals(AsState.INACTIVE, remAs.getState());
  275. assertTrue(validateMessage(aspFactory1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  276. Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
  277. // Check for ASP_UP for ASP2
  278. aspFactory2.read(message);
  279. assertEquals(AspState.INACTIVE, remAsp2.getState());
  280. assertTrue(validateMessage(aspFactory2, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
  281. // also the AS should be INACTIVE now
  282. assertEquals(AsState.INACTIVE, remAs.getState());
  283. assertTrue(validateMessage(aspFactory2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  284. Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
  285. // Check for ASP_ACTIVE for ASP1
  286. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
  287. ((ASPActiveImpl) message).setRoutingContext(rc);
  288. aspFactory1.read(message);
  289. assertEquals(AspState.ACTIVE, remAsp1.getState());
  290. assertTrue(validateMessage(aspFactory1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1,
  291. -1));
  292. // also the AS should be ACTIVE now and ACTIVE should be delivered to
  293. // both the ASPs
  294. assertEquals(AsState.ACTIVE, remAs.getState());
  295. assertTrue(validateMessage(aspFactory1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  296. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  297. assertTrue(validateMessage(aspFactory2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  298. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  299. // INACTIVATE the ASP1
  300. // 5.2.1. 1+1 Sparing, Withdrawal of ASP, Backup Override
  301. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
  302. aspFactory1.read(message);
  303. assertEquals(AspState.INACTIVE, remAsp1.getState());
  304. assertTrue(validateMessage(aspFactory1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1,
  305. -1));
  306. // also the AS should be PENDING now and should send PENDING NTFY to
  307. // both the ASPS
  308. assertEquals(AsState.PENDING, remAs.getState());
  309. assertTrue(validateMessage(aspFactory1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  310. Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
  311. assertTrue(validateMessage(aspFactory2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  312. Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
  313. // ACTIVATE ASP2
  314. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
  315. ((ASPActiveImpl) message).setRoutingContext(rc);
  316. aspFactory2.read(message);
  317. assertEquals(AspState.ACTIVE, remAsp2.getState());
  318. assertTrue(validateMessage(aspFactory2, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1,
  319. -1));
  320. // also the AS should be ACTIVE now and ACTIVE should be delivered to
  321. // both the ASPs
  322. assertEquals(AsState.ACTIVE, remAs.getState());
  323. assertTrue(validateMessage(aspFactory2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  324. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  325. assertTrue(validateMessage(aspFactory1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  326. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  327. // 5.2.2. 1+1 Sparing, Backup Override
  328. // ACTIVATE ASP1 also
  329. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
  330. ((ASPActiveImpl) message).setRoutingContext(rc);
  331. aspFactory1.read(message);
  332. assertEquals(AspState.ACTIVE, remAsp1.getState());
  333. assertTrue(validateMessage(aspFactory1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1,
  334. -1));
  335. // The AS remains ACTIVE and sends NTFY(Alt ASP-Act) to ASP2
  336. assertEquals(AsState.ACTIVE, remAs.getState());
  337. // ASP2 should get Alternate ASP is active
  338. assertTrue(validateMessage(aspFactory2, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_Other,
  339. Status.INFO_Alternate_ASP_Active));
  340. // The state of ASP2 now should be INACTIVE
  341. assertEquals(AspState.INACTIVE, remAsp2.getState());
  342. assertNull(aspFactory1.txPoll());
  343. assertNull(aspFactory2.txPoll());
  344. }
  345. @Test
  346. public void testTwoAspInAsLoadshare() throws Exception {
  347. // 5.1.2. Two ASPs in Application Server ("1+1" Sparing)
  348. RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 });
  349. DestinationPointCode[] dpc = new DestinationPointCode[] { parmFactory
  350. .createDestinationPointCode(123, (short) 0) };
  351. ServiceIndicators[] servInds = new ServiceIndicators[] { parmFactory.createServiceIndicators(new short[] { 3 }) };
  352. TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Loadshare);
  353. LocalRKIdentifier lRkId = parmFactory.createLocalRKIdentifier(1);
  354. RoutingKey rKey = parmFactory.createRoutingKey(lRkId, rc, null, null, dpc, servInds, null);
  355. // As remAs = sgw.createAppServer("testas", rc, rKey, trModType);
  356. As remAs = serverM3UAMgmt
  357. .createAppServer("m3ua ras create rc 100 rk dpc 123 si 3 traffic-mode loadshare testas".split(" "));
  358. // 2+0 sparing loadsharing
  359. remAs.setMinAspActiveForLb(2);
  360. // AspFactory aspFactory1 = sgw.createAspFactory("testasp1",
  361. // "127.0.0.1", 2777);
  362. AspFactory aspFactory1 = serverM3UAMgmt.createAspFactory("m3ua rasp create ip 127.0.0.1 port 2777 testasp1"
  363. .split(" "));
  364. // AspFactory aspFactory2 = sgw.createAspFactory("testasp2",
  365. // "127.0.0.1", 2778);
  366. AspFactory aspFactory2 = serverM3UAMgmt.createAspFactory("m3ua rasp create ip 127.0.0.1 port 2778 testasp2"
  367. .split(" "));
  368. Asp remAsp1 = serverM3UAMgmt.assignAspToAs("testas", "testasp1");
  369. Asp remAsp2 = serverM3UAMgmt.assignAspToAs("testas", "testasp2");
  370. // Check for Communication UP for ASP1
  371. aspFactory1.onCommStateChange(CommunicationState.UP);
  372. assertEquals(AspState.DOWN, remAsp1.getState());
  373. // Check for Communication UP for ASP2
  374. aspFactory2.onCommStateChange(CommunicationState.UP);
  375. assertEquals(AspState.DOWN, remAsp2.getState());
  376. // Check for ASP_UP for ASP1
  377. M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
  378. aspFactory1.read(message);
  379. assertEquals(AspState.INACTIVE, remAsp1.getState());
  380. assertTrue(validateMessage(aspFactory1, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
  381. // also the AS should be INACTIVE now
  382. assertEquals(AsState.INACTIVE, remAs.getState());
  383. assertTrue(validateMessage(aspFactory1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  384. Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
  385. // Check for ASP_UP for ASP2
  386. message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
  387. aspFactory2.read(message);
  388. assertEquals(AspState.INACTIVE, remAsp2.getState());
  389. assertTrue(validateMessage(aspFactory2, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
  390. // also the AS should be INACTIVE
  391. assertEquals(AsState.INACTIVE, remAs.getState());
  392. assertTrue(validateMessage(aspFactory2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  393. Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
  394. // Check for ASP_ACTIVE for ASP1
  395. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
  396. ((ASPActiveImpl) message).setRoutingContext(rc);
  397. aspFactory1.read(message);
  398. assertEquals(AspState.ACTIVE, remAsp1.getState());
  399. assertTrue(validateMessage(aspFactory1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1,
  400. -1));
  401. // But AS still INACTIVE as atleast 2 ASP's should be ACTIVE
  402. assertEquals(AsState.INACTIVE, remAs.getState());
  403. // Check for ASP_ACTIVE for ASP2
  404. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
  405. ((ASPActiveImpl) message).setRoutingContext(rc);
  406. aspFactory2.read(message);
  407. assertEquals(AspState.ACTIVE, remAsp2.getState());
  408. assertTrue(validateMessage(aspFactory2, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1,
  409. -1));
  410. // Now AS will be ACTIVE and send NTFY to both the ASP's
  411. assertEquals(AsState.ACTIVE, remAs.getState());
  412. assertTrue(validateMessage(aspFactory1, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  413. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  414. assertTrue(validateMessage(aspFactory2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  415. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  416. // INACTIVATE ASP1.But AS remains ACTIVE in any case
  417. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
  418. aspFactory1.read(message);
  419. assertEquals(AspState.INACTIVE, remAsp1.getState());
  420. assertTrue(validateMessage(aspFactory1, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1,
  421. -1));
  422. // ASP1 also receives NTFY Ins ASP Resource as we have fallen bellow
  423. // threshold
  424. assertTrue(validateMessage(aspFactory1, MessageClass.MANAGEMENT, MessageType.NOTIFY, Status.STATUS_Other,
  425. Status.INFO_Insufficient_ASP_Resources_Active));
  426. // AS remains ACTIVE
  427. assertEquals(AsState.ACTIVE, remAs.getState());
  428. // Bring down ASP1
  429. message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN);
  430. aspFactory1.read(message);
  431. assertEquals(AspState.DOWN, remAsp1.getState());
  432. assertTrue(validateMessage(aspFactory1, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_DOWN_ACK, -1, -1));
  433. assertNull(aspFactory1.txPoll());
  434. // AS remains ACTIVE
  435. assertEquals(AsState.ACTIVE, remAs.getState());
  436. // INACTIVATE ASP2.Now AS becomes PENDING and sends NTFY to all ASP's in
  437. // INACTIVE state
  438. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
  439. aspFactory2.read(message);
  440. assertEquals(AspState.INACTIVE, remAsp2.getState());
  441. assertTrue(validateMessage(aspFactory2, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1,
  442. -1));
  443. // AS remains ACTIVE
  444. assertEquals(AsState.PENDING, remAs.getState());
  445. // AS state change NTFY message
  446. assertTrue(validateMessage(aspFactory2, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  447. Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
  448. assertNull(aspFactory1.txPoll());
  449. assertNull(aspFactory2.txPoll());
  450. }
  451. @Test
  452. public void testAspUpReceivedWhileASPIsAlreadyUp() throws Exception {
  453. // Test bug http://code.google.com/p/mobicents/issues/detail?id=2436
  454. // 4.3.4.1. ASP Up Procedures from http://tools.ietf.org/html/rfc4666
  455. RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 });
  456. DestinationPointCode[] dpc = new DestinationPointCode[] { parmFactory
  457. .createDestinationPointCode(123, (short) 0) };
  458. ServiceIndicators[] servInds = new ServiceIndicators[] { parmFactory.createServiceIndicators(new short[] { 3 }) };
  459. TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Override);
  460. LocalRKIdentifier lRkId = parmFactory.createLocalRKIdentifier(1);
  461. RoutingKey rKey = parmFactory.createRoutingKey(lRkId, rc, null, null, dpc, servInds, null);
  462. // As remAs = sgw.createAppServer("testas", rc, rKey, trModType);
  463. As remAs = serverM3UAMgmt.createAppServer("m3ua ras create rc 100 rk dpc 123 si 3 traffic-mode override testas"
  464. .split(" "));
  465. // AspFactory aspFactory = sgw.createAspFactory("testasp", "127.0.0.1",
  466. // 2777);
  467. AspFactory aspFactory = serverM3UAMgmt.createAspFactory("m3ua rasp create ip 127.0.0.1 port 2777 testasp"
  468. .split(" "));
  469. Asp remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp");
  470. // Check for Communication UP
  471. aspFactory.onCommStateChange(CommunicationState.UP);
  472. assertEquals(AspState.DOWN, remAsp.getState());
  473. // Check for ASP_UP
  474. M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
  475. aspFactory.read(message);
  476. assertEquals(AspState.INACTIVE, remAsp.getState());
  477. assertTrue(validateMessage(aspFactory, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
  478. // also the AS should be INACTIVE now
  479. assertEquals(AsState.INACTIVE, remAs.getState());
  480. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  481. Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
  482. // Check for ASP_ACTIVE
  483. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
  484. ((ASPActiveImpl) message).setRoutingContext(rc);
  485. aspFactory.read(message);
  486. assertEquals(AspState.ACTIVE, remAsp.getState());
  487. assertTrue(validateMessage(aspFactory, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
  488. // also the AS should be ACTIVE now
  489. assertEquals(AsState.ACTIVE, remAs.getState());
  490. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  491. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  492. // Check for ASP_UP received while ASP is already UP
  493. message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
  494. aspFactory.read(message);
  495. // The ASP Transitions to INACTIVE
  496. assertEquals(AspState.INACTIVE, remAsp.getState());
  497. // Receives ASP_UP Ack messages
  498. assertTrue(validateMessage(aspFactory, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
  499. // As well as receives Error message
  500. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.ERROR,
  501. ErrorCode.Unexpected_Message, 100));
  502. // also the AS should be PENDING now
  503. assertEquals(AsState.PENDING, remAs.getState());
  504. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  505. Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
  506. // Make sure we don't have any more
  507. assertNull(aspFactory.txPoll());
  508. }
  509. @Test
  510. public void testPendingQueue() throws Exception {
  511. RoutingContext rc = parmFactory.createRoutingContext(new long[] { 100 });
  512. DestinationPointCode[] dpc = new DestinationPointCode[] { parmFactory
  513. .createDestinationPointCode(123, (short) 0) };
  514. ServiceIndicators[] servInds = new ServiceIndicators[] { parmFactory.createServiceIndicators(new short[] { 3 }) };
  515. TrafficModeType trModType = parmFactory.createTrafficModeType(TrafficModeType.Override);
  516. LocalRKIdentifier lRkId = parmFactory.createLocalRKIdentifier(1);
  517. RoutingKey rKey = parmFactory.createRoutingKey(lRkId, rc, null, null, dpc, servInds, null);
  518. // As remAs = sgw.createAppServer("testas", rc, rKey, trModType);
  519. As remAs = serverM3UAMgmt.createAppServer("m3ua ras create rc 100 rk dpc 123 si 3 traffic-mode override testas"
  520. .split(" "));
  521. // AspFactory aspFactory = sgw.createAspFactory("testasp", "127.0.0.1",
  522. // 2777);
  523. AspFactory aspFactory = serverM3UAMgmt.createAspFactory("m3ua rasp create ip 127.0.0.1 port 2777 testasp"
  524. .split(" "));
  525. Asp remAsp = serverM3UAMgmt.assignAspToAs("testas", "testasp");
  526. // Check for Communication UP
  527. aspFactory.onCommStateChange(CommunicationState.UP);
  528. assertEquals(AspState.DOWN, remAsp.getState());
  529. // Check for ASP_UP
  530. M3UAMessageImpl message = messageFactory.createMessage(MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP);
  531. aspFactory.read(message);
  532. assertEquals(AspState.INACTIVE, remAsp.getState());
  533. assertTrue(validateMessage(aspFactory, MessageClass.ASP_STATE_MAINTENANCE, MessageType.ASP_UP_ACK, -1, -1));
  534. // also the AS should be INACTIVE now
  535. assertEquals(AsState.INACTIVE, remAs.getState());
  536. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  537. Status.STATUS_AS_State_Change, Status.INFO_AS_INACTIVE));
  538. // Check for ASP_ACTIVE
  539. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
  540. ((ASPActiveImpl) message).setRoutingContext(rc);
  541. aspFactory.read(message);
  542. assertEquals(AspState.ACTIVE, remAsp.getState());
  543. assertTrue(validateMessage(aspFactory, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
  544. // also the AS should be ACTIVE now
  545. assertEquals(AsState.ACTIVE, remAs.getState());
  546. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  547. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  548. // Check for ASP_INACTIVE
  549. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE);
  550. aspFactory.read(message);
  551. assertEquals(AspState.INACTIVE, remAsp.getState());
  552. assertTrue(validateMessage(aspFactory, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_INACTIVE_ACK, -1,
  553. -1));
  554. // also the AS should be PENDING now
  555. assertEquals(AsState.PENDING, remAs.getState());
  556. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  557. Status.STATUS_AS_State_Change, Status.INFO_AS_PENDING));
  558. // Add PayloadData
  559. PayloadDataImpl payload = (PayloadDataImpl) messageFactory.createMessage(MessageClass.TRANSFER_MESSAGES,
  560. MessageType.PAYLOAD);
  561. ProtocolDataImpl p1 = (ProtocolDataImpl) parmFactory.createProtocolData(1408, 123, 3, 1, 0, 1, new byte[] { 1,
  562. 2, 3, 4 });
  563. payload.setRoutingContext(rc);
  564. payload.setData(p1);
  565. remAs.write(payload);
  566. // Now bring UP the ASP
  567. message = messageFactory.createMessage(MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE);
  568. ((ASPActiveImpl) message).setRoutingContext(rc);
  569. aspFactory.read(message);
  570. assertTrue(validateMessage(aspFactory, MessageClass.ASP_TRAFFIC_MAINTENANCE, MessageType.ASP_ACTIVE_ACK, -1, -1));
  571. // also the AS should be ACTIVE now
  572. assertEquals(AsState.ACTIVE, remAs.getState());
  573. assertTrue(validateMessage(aspFactory, MessageClass.MANAGEMENT, MessageType.NOTIFY,
  574. Status.STATUS_AS_State_Change, Status.INFO_AS_ACTIVE));
  575. // Also we should have PayloadData
  576. M3UAMessage payLoadTemp = aspFactory.txPoll();
  577. assertNotNull(payLoadTemp);
  578. assertEquals(MessageClass.TRANSFER_MESSAGES, payLoadTemp.getMessageClass());
  579. assertEquals(MessageType.PAYLOAD, payLoadTemp.getMessageType());
  580. // Make sure we don't have any more
  581. assertNull(aspFactory.txPoll());
  582. }
  583. /**
  584. *
  585. * @param factory
  586. * @param msgClass
  587. * @param msgType
  588. * @param type
  589. * The type for Notify message Or Error Code for Error Messages
  590. * @param info
  591. * The Info for Notify message Or RoutingContext for Error
  592. * Message
  593. * @return
  594. */
  595. private boolean validateMessage(AspFactory factory, int msgClass, int msgType, int type, int info) {
  596. M3UAMessage message = factory.txPoll();
  597. if (message == null) {
  598. return false;
  599. }
  600. if (message.getMessageClass() != msgClass || message.getMessageType() != msgType) {
  601. return false;
  602. }
  603. if (message.getMessageClass() == MessageClass.MANAGEMENT) {
  604. if (message.getMessageType() == MessageType.NOTIFY) {
  605. Status s = ((Notify) message).getStatus();
  606. if (s.getType() != type || s.getInfo() != info) {
  607. return false;
  608. } else {
  609. return true;
  610. }
  611. } else if (message.getMessageType() == MessageType.ERROR) {
  612. ErrorCode errCode = ((org.mobicents.protocols.ss7.m3ua.message.mgmt.Error) message).getErrorCode();
  613. if (errCode.getCode() != type) {
  614. return false;
  615. }
  616. RoutingContext rc = ((org.mobicents.protocols.ss7.m3ua.message.mgmt.Error) message).getRoutingContext();
  617. if (rc == null || rc.getRoutingContexts()[0] != info) {
  618. return false;
  619. }
  620. return true;
  621. }
  622. return false;
  623. } else {
  624. return true;
  625. }
  626. }
  627. }