/* * TeleStax, Open Source Cloud Communications * Copyright 2011-2016, Telestax Inc and individual contributors * by the @authors tag. * * 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.restcomm.media.control.mgcp.pkg; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Test; import org.restcomm.media.control.mgcp.exception.MgcpParseException; import org.restcomm.media.control.mgcp.pkg.MgcpActionType; import org.restcomm.media.control.mgcp.pkg.MgcpEventType; import org.restcomm.media.control.mgcp.pkg.MgcpPackage; import org.restcomm.media.control.mgcp.pkg.MgcpPackageManager; import org.restcomm.media.control.mgcp.pkg.MgcpRequestedEvent; import org.restcomm.media.control.mgcp.pkg.MgcpRequestedEventsParser; import org.restcomm.media.control.mgcp.pkg.exception.UnrecognizedMgcpActionException; import org.restcomm.media.control.mgcp.pkg.exception.UnrecognizedMgcpEventException; import org.restcomm.media.control.mgcp.pkg.exception.UnrecognizedMgcpPackageException; /** * @author Henrique Rosa (henrique.rosa@telestax.com) * */ public class MgcpRequestedEventsParserTest { @Test public void testParseEndpointEventWithoutParameters() throws Exception { // given final int requestId = 16; final String requestedEvents = "AU/oc(N)"; final MgcpEventType eventType = mock(MgcpEventType.class); final MgcpPackage mgcpPackage = mock(MgcpPackage.class); final MgcpPackageManager packageManager = mock(MgcpPackageManager.class); // when when(packageManager.getPackage("AU")).thenReturn(mgcpPackage); when(mgcpPackage.getEventDetails("oc")).thenReturn(eventType); when(eventType.parameterized()).thenReturn(false); MgcpRequestedEvent[] events = MgcpRequestedEventsParser.parse(requestId, requestedEvents, packageManager); // then assertEquals(1, events.length); final MgcpRequestedEvent oc = events[0]; assertNotNull(oc); assertEquals(requestId, oc.getRequestId()); assertEquals("AU", oc.getPackageName()); assertEquals("oc", oc.getEventType()); assertEquals(0, oc.getConnectionId()); assertEquals(0, oc.getParameters().length); assertEquals(MgcpActionType.NOTIFY, oc.getAction()); } @Test public void testParseEndpointEventWithParameters() throws Exception { // given final int requestId = 16; final String requestedEvents = "AU/oc(N)(param1=value1,param2=value2)"; final MgcpEventType eventType = mock(MgcpEventType.class); final MgcpPackage mgcpPackage = mock(MgcpPackage.class); final MgcpPackageManager packageManager = mock(MgcpPackageManager.class); // when when(packageManager.getPackage("AU")).thenReturn(mgcpPackage); when(mgcpPackage.getEventDetails("oc")).thenReturn(eventType); when(eventType.parameterized()).thenReturn(true); MgcpRequestedEvent[] events = MgcpRequestedEventsParser.parse(requestId, requestedEvents, packageManager); // then assertEquals(1, events.length); final MgcpRequestedEvent event = events[0]; assertNotNull(event); assertEquals(requestId, event.getRequestId()); assertEquals("AU", event.getPackageName()); assertEquals("oc", event.getEventType()); assertEquals(0, event.getConnectionId()); assertEquals(2, event.getParameters().length); assertEquals(MgcpActionType.NOTIFY, event.getAction()); } @Test public void testParseConnectionEventWithoutParameters() throws Exception { // given final int requestId = 16; final String requestedEvents = "R/rto@364823(N)"; final MgcpEventType eventType = mock(MgcpEventType.class); final MgcpPackage mgcpPackage = mock(MgcpPackage.class); final MgcpPackageManager packageManager = mock(MgcpPackageManager.class); // when when(packageManager.getPackage("R")).thenReturn(mgcpPackage); when(mgcpPackage.getEventDetails("rto")).thenReturn(eventType); when(eventType.parameterized()).thenReturn(false); MgcpRequestedEvent[] events = MgcpRequestedEventsParser.parse(requestId, requestedEvents, packageManager); // then assertEquals(1, events.length); final MgcpRequestedEvent event = events[0]; assertNotNull(event); assertEquals(requestId, event.getRequestId()); assertEquals("R", event.getPackageName()); assertEquals("rto", event.getEventType()); assertEquals(Integer.parseInt("364823", 16), event.getConnectionId()); assertEquals(MgcpActionType.NOTIFY, event.getAction()); } @Test public void testParseMulitpleEvents() throws Exception { // given final int requestId = 16; final String requestedEvents = "AU/oc(N),R/rto@AB23F(N)(100,st=im),AU/of(N)"; final MgcpEventType audioEventType = mock(MgcpEventType.class); final MgcpPackage audioPackage = mock(MgcpPackage.class); final MgcpPackage rtpPackage = mock(MgcpPackage.class); final MgcpEventType rtpEventType = mock(MgcpEventType.class); final MgcpPackageManager packageManager = mock(MgcpPackageManager.class); // when when(packageManager.getPackage("AU")).thenReturn(audioPackage); when(audioPackage.getEventDetails(any(String.class))).thenReturn(audioEventType); when(audioEventType.parameterized()).thenReturn(false); when(packageManager.getPackage("R")).thenReturn(rtpPackage); when(rtpPackage.getEventDetails("rto")).thenReturn(rtpEventType); when(rtpEventType.parameterized()).thenReturn(true); MgcpRequestedEvent[] events = MgcpRequestedEventsParser.parse(requestId, requestedEvents, packageManager); // then assertEquals(3, events.length); final MgcpRequestedEvent oc = events[0]; assertNotNull(oc); assertEquals(requestId, oc.getRequestId()); assertEquals("AU", oc.getPackageName()); assertEquals("oc", oc.getEventType()); assertEquals(0, oc.getConnectionId()); assertEquals(0, oc.getParameters().length); assertEquals(MgcpActionType.NOTIFY, oc.getAction()); final MgcpRequestedEvent rto = events[1]; assertNotNull(rto); assertEquals(requestId, rto.getRequestId()); assertEquals("R", rto.getPackageName()); assertEquals("rto", rto.getEventType()); assertEquals(Integer.parseInt("AB23F", 16), rto.getConnectionId()); assertEquals(2, rto.getParameters().length); assertEquals(MgcpActionType.NOTIFY, rto.getAction()); final MgcpRequestedEvent of = events[2]; assertNotNull(of); assertEquals(requestId, of.getRequestId()); assertEquals("AU", of.getPackageName()); assertEquals("of", of.getEventType()); assertEquals(0, of.getConnectionId()); assertEquals(0, of.getParameters().length); assertEquals(MgcpActionType.NOTIFY, of.getAction()); } @Test(expected = UnrecognizedMgcpPackageException.class) public void testParseUnrecognizedPackage() throws Exception { // given final int requestId = 16; final String requestedEvents = "XYZ/oc(N),AU/of(N)"; final MgcpPackageManager packageManager = mock(MgcpPackageManager.class); // when when(packageManager.getPackage("XYZ")).thenReturn(null); MgcpRequestedEventsParser.parse(requestId, requestedEvents, packageManager); } @Test(expected = UnrecognizedMgcpEventException.class) public void testParseUnrecognizedEvent() throws Exception { // given final int requestId = 16; final String requestedEvents = "AU/xyz(N),AU/of(N)"; final MgcpPackage mgcpPackage = mock(MgcpPackage.class); final MgcpPackageManager packageManager = mock(MgcpPackageManager.class); // when when(packageManager.getPackage("AU")).thenReturn(mgcpPackage); when(mgcpPackage.getEventDetails("xyz")).thenReturn(null); MgcpRequestedEventsParser.parse(requestId, requestedEvents, packageManager); } @Test(expected = UnrecognizedMgcpActionException.class) public void testParseUnrecognizedAction() throws Exception { // given final int requestId = 16; final String requestedEvents = "AU/oc(XYZ),AU/of(N)"; final MgcpPackage mgcpPackage = mock(MgcpPackage.class); final MgcpEventType eventType = mock(MgcpEventType.class); final MgcpPackageManager packageManager = mock(MgcpPackageManager.class); // when when(packageManager.getPackage("AU")).thenReturn(mgcpPackage); when(mgcpPackage.getEventDetails(any(String.class))).thenReturn(eventType); when(eventType.parameterized()).thenReturn(false); MgcpRequestedEventsParser.parse(requestId, requestedEvents, packageManager); } @Test(expected = MgcpParseException.class) public void testParseMalformedRequest() throws Exception { // given final int requestId = 16; final String requestedEvents = "AU/oc(XYZ"; final MgcpPackage mgcpPackage = mock(MgcpPackage.class); final MgcpEventType eventType = mock(MgcpEventType.class); final MgcpPackageManager packageManager = mock(MgcpPackageManager.class); // when when(packageManager.getPackage("AU")).thenReturn(mgcpPackage); when(mgcpPackage.getEventDetails(any(String.class))).thenReturn(eventType); when(eventType.parameterized()).thenReturn(false); MgcpRequestedEventsParser.parse(requestId, requestedEvents, packageManager); } }