/* * 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.message; import static org.junit.Assert.*; import org.junit.Test; import org.restcomm.media.control.mgcp.exception.MgcpParseException; import org.restcomm.media.control.mgcp.message.MgcpMessageParser; import org.restcomm.media.control.mgcp.message.MgcpParameterType; import org.restcomm.media.control.mgcp.message.MgcpRequest; import org.restcomm.media.control.mgcp.message.MgcpRequestType; import org.restcomm.media.control.mgcp.message.MgcpResponse; /** * @author Henrique Rosa (henrique.rosa@telestax.com) * */ public class MgcpMessageParserTest { @Test public void testParseCrcxRequest() throws MgcpParseException { // given StringBuilder builder = new StringBuilder(); builder.append("CRCX 147483653 mobicents/bridge/$@127.0.0.1:2427 MGCP 1.0").append(System.lineSeparator()); builder.append("C:1").append(System.lineSeparator()); builder.append("M:sendrecv").append(System.lineSeparator()); builder.append("N:restcomm@127.0.0.1:2727").append(System.lineSeparator()); builder.append("Z2:mobicents/ivr/$@127.0.0.1:2427"); MgcpMessageParser parser = new MgcpMessageParser(); // when MgcpRequest request = parser.parseRequest(builder.toString()); // then assertEquals(MgcpRequestType.CRCX, request.getRequestType()); assertEquals(147483653, request.getTransactionId()); assertEquals("mobicents/bridge/$@127.0.0.1:2427", request.getEndpointId()); assertEquals("1", request.getParameter(MgcpParameterType.CALL_ID)); assertEquals("sendrecv", request.getParameter(MgcpParameterType.MODE)); assertEquals("restcomm@127.0.0.1:2727", request.getParameter(MgcpParameterType.NOTIFIED_ENTITY)); assertEquals("mobicents/ivr/$@127.0.0.1:2427", request.getParameter(MgcpParameterType.SECOND_ENDPOINT)); } /** * Patch for https://github.com/RestComm/mediaserver/pull/420 */ @Test public void testParseCrcxRequestWithWhitespaceBetweenParameters() throws MgcpParseException { // given StringBuilder builder = new StringBuilder(); builder.append("CRCX 147483653 mobicents/bridge/$@127.0.0.1:2427 MGCP 1.0").append(System.lineSeparator()); builder.append("C: 1").append(System.lineSeparator()); builder.append("M: sendrecv").append(System.lineSeparator()); builder.append("N: restcomm@127.0.0.1:2727").append(System.lineSeparator()); builder.append("Z2: mobicents/ivr/$@127.0.0.1:2427"); MgcpMessageParser parser = new MgcpMessageParser(); // when MgcpRequest request = parser.parseRequest(builder.toString()); // then assertEquals(MgcpRequestType.CRCX, request.getRequestType()); assertEquals(147483653, request.getTransactionId()); assertEquals("mobicents/bridge/$@127.0.0.1:2427", request.getEndpointId()); assertEquals("1", request.getParameter(MgcpParameterType.CALL_ID)); assertEquals("sendrecv", request.getParameter(MgcpParameterType.MODE)); assertEquals("restcomm@127.0.0.1:2727", request.getParameter(MgcpParameterType.NOTIFIED_ENTITY)); assertEquals("mobicents/ivr/$@127.0.0.1:2427", request.getParameter(MgcpParameterType.SECOND_ENDPOINT)); } @Test public void testParseCrcxRequestWithSdp() throws MgcpParseException { // given StringBuilder builder = new StringBuilder(); builder.append("CRCX 147483655 mobicents/bridge/1@127.0.0.1:2427 MGCP 1.0").append(System.lineSeparator()); builder.append("C:1").append(System.lineSeparator()); builder.append("M:sendrecv").append(System.lineSeparator()); builder.append("N:restcomm@127.0.0.1:2727").append(System.lineSeparator()); builder.append("L:webrtc:false").append(System.lineSeparator()); builder.append(System.lineSeparator()); StringBuilder builderSdp = new StringBuilder(); builderSdp.append("v=0").append(System.lineSeparator()); builderSdp.append("o=hrosa 3616 1899 IN IP4 127.0.0.1").append(System.lineSeparator()); builderSdp.append("s=Talk").append(System.lineSeparator()); builderSdp.append("c=IN IP4 127.0.0.1").append(System.lineSeparator()); builderSdp.append("t=0 0").append(System.lineSeparator()); builderSdp.append("a=rtcp-xr:rcvr-rtt=all:10000 stat-summary=loss,dup,jitt,TTL voip-metrics") .append(System.lineSeparator()); builderSdp.append("m=audio 7070 RTP/AVP 8 0 101").append(System.lineSeparator()); builderSdp.append("a=rtpmap:101 telephone-event/8000"); builder.append(builderSdp.toString()); MgcpMessageParser parser = new MgcpMessageParser(); // when MgcpRequest request = parser.parseRequest(builder.toString()); // then assertEquals(MgcpRequestType.CRCX, request.getRequestType()); assertEquals(147483655, request.getTransactionId()); assertEquals("mobicents/bridge/1@127.0.0.1:2427", request.getEndpointId()); assertEquals("1", request.getParameter(MgcpParameterType.CALL_ID)); assertEquals("sendrecv", request.getParameter(MgcpParameterType.MODE)); assertEquals("restcomm@127.0.0.1:2727", request.getParameter(MgcpParameterType.NOTIFIED_ENTITY)); assertEquals("webrtc:false", request.getParameter(MgcpParameterType.LOCAL_CONNECTION_OPTIONS)); assertTrue(request.isSdpDetected()); assertEquals(builderSdp.toString(), request.getParameter(MgcpParameterType.SDP)); } @Test public void testParseMdcxRequest() throws MgcpParseException { // given StringBuilder builder = new StringBuilder(); builder.append("MDCX 147483654 mobicents/ivr/1@127.0.0.1:2427 MGCP 1.0").append(System.lineSeparator()); builder.append("C:1").append(System.lineSeparator()); builder.append("I:10").append(System.lineSeparator()); builder.append("M:sendrecv").append(System.lineSeparator()); MgcpMessageParser parser = new MgcpMessageParser(); // when MgcpRequest request = parser.parseRequest(builder.toString()); // then assertEquals(MgcpRequestType.MDCX, request.getRequestType()); assertEquals(147483654, request.getTransactionId()); assertEquals("mobicents/ivr/1@127.0.0.1:2427", request.getEndpointId()); assertEquals("1", request.getParameter(MgcpParameterType.CALL_ID)); assertEquals("sendrecv", request.getParameter(MgcpParameterType.MODE)); assertEquals("10", request.getParameter(MgcpParameterType.CONNECTION_ID)); } @Test public void testParseRqntRequest() throws MgcpParseException { // given StringBuilder builder = new StringBuilder(); builder.append("RQNT 147483656 mobicents/ivr/1@127.0.0.1:2427 MGCP 1.0").append(System.lineSeparator()); builder.append("N:restcomm@127.0.0.1:2727").append(System.lineSeparator()); builder.append("X:1").append(System.lineSeparator()); builder.append("S:AU/pa(an=http://localhost:8080/restcomm/cache/ACae6e420f425248d6a26948c17a9e2acf/35ea210b73dcaa203f471c0e30304811a8b89b94a598aa9c44f1c3a5d8a7ce88.wav it=1)").append(System.lineSeparator()); builder.append("R:AU/oc(N),AU/of(N)").append(System.lineSeparator()); MgcpMessageParser parser = new MgcpMessageParser(); // when MgcpRequest request = parser.parseRequest(builder.toString()); // then assertEquals(MgcpRequestType.RQNT, request.getRequestType()); assertEquals(147483656, request.getTransactionId()); assertEquals("mobicents/ivr/1@127.0.0.1:2427", request.getEndpointId()); assertEquals("1", request.getParameter(MgcpParameterType.REQUEST_ID)); assertEquals("AU/pa(an=http://localhost:8080/restcomm/cache/ACae6e420f425248d6a26948c17a9e2acf/35ea210b73dcaa203f471c0e30304811a8b89b94a598aa9c44f1c3a5d8a7ce88.wav it=1)",request.getParameter(MgcpParameterType.REQUESTED_SIGNALS)); assertEquals("AU/oc(N),AU/of(N)", request.getParameter(MgcpParameterType.REQUESTED_EVENTS)); } @Test public void testParseNtfyRequest() throws MgcpParseException { // given StringBuilder builder = new StringBuilder(); builder.append("NTFY 2 mobicents/ivr/1@127.0.0.1:2427").append(System.lineSeparator()); builder.append("N:restcomm@127.0.0.1:2727").append(System.lineSeparator()); builder.append("O:AU/oc(rc=100)").append(System.lineSeparator()); builder.append("X:1").append(System.lineSeparator()); MgcpMessageParser parser = new MgcpMessageParser(); // when MgcpRequest request = parser.parseRequest(builder.toString()); // then assertEquals(MgcpRequestType.NTFY, request.getRequestType()); assertEquals(2, request.getTransactionId()); assertEquals("mobicents/ivr/1@127.0.0.1:2427", request.getEndpointId()); assertEquals("1", request.getParameter(MgcpParameterType.REQUEST_ID)); assertEquals("AU/oc(rc=100)", request.getParameter(MgcpParameterType.OBSERVED_EVENT)); } @Test public void testParseOkResponse() throws MgcpParseException { // given StringBuilder builder = new StringBuilder(); builder.append("200 147483653 Successful Transaction").append(System.lineSeparator()); builder.append("I:1f").append(System.lineSeparator()); builder.append("Z:mobicents/bridge/1@127.0.0.1:2427").append(System.lineSeparator()); builder.append("Z2:mobicents/ivr/1@127.0.0.1:2427").append(System.lineSeparator()); builder.append("I2:10").append(System.lineSeparator()); MgcpMessageParser parser = new MgcpMessageParser(); // when MgcpResponse response = parser.parseResponse(builder.toString()); // then assertEquals(200, response.getCode()); assertEquals(147483653, response.getTransactionId()); assertEquals("Successful Transaction", response.getMessage()); assertEquals("1f", response.getParameter(MgcpParameterType.CONNECTION_ID)); assertEquals("mobicents/bridge/1@127.0.0.1:2427", response.getParameter(MgcpParameterType.ENDPOINT_ID)); assertEquals("mobicents/ivr/1@127.0.0.1:2427", response.getParameter(MgcpParameterType.SECOND_ENDPOINT)); assertEquals("10", response.getParameter(MgcpParameterType.CONNECTION_ID2)); } @Test public void testParseOkResponseWithSdp() throws MgcpParseException { // given StringBuilder builder = new StringBuilder(); builder.append("200 147483655 Successful Transaction").append(System.lineSeparator()); builder.append("I:20").append(System.lineSeparator()); builder.append("Z:mobicents/bridge/1@127.0.0.1:2427").append(System.lineSeparator()); builder.append(System.lineSeparator()); StringBuilder builderSdp = new StringBuilder(); builderSdp.append("v=0").append(System.lineSeparator()); builderSdp.append("o=- 1461941902737 1 IN IP4 127.0.0.1").append(System.lineSeparator()); builderSdp.append("s=Mobicents Media Server").append(System.lineSeparator()); builderSdp.append("c=IN IP4 127.0.0.1").append(System.lineSeparator()); builderSdp.append("t=0 0").append(System.lineSeparator()); builderSdp.append("m=audio 65534 RTP/AVP 8 0 101").append(System.lineSeparator()); builderSdp.append("c=IN IP4 127.0.0.1").append(System.lineSeparator()); builderSdp.append("a=sendrecv").append(System.lineSeparator()); builderSdp.append("a=rtcp:65535 IN IP4 127.0.0.1").append(System.lineSeparator()); builderSdp.append("a=ptime:20").append(System.lineSeparator()); builderSdp.append("a=rtpmap:0 pcmu/8000").append(System.lineSeparator()); builderSdp.append("a=rtpmap:101 telephone-event/8000").append(System.lineSeparator()); builderSdp.append("a=rtpmap:8 pcma/8000").append(System.lineSeparator()); builderSdp.append("a=ssrc:2849765541 cname:l3l35Nm+9PFH1A9O"); builder.append(builderSdp.toString()); MgcpMessageParser parser = new MgcpMessageParser(); // when MgcpResponse response = parser.parseResponse(builder.toString()); // then assertEquals(200, response.getCode()); assertEquals(147483655, response.getTransactionId()); assertEquals("Successful Transaction", response.getMessage()); assertEquals("20", response.getParameter(MgcpParameterType.CONNECTION_ID)); assertEquals("mobicents/bridge/1@127.0.0.1:2427", response.getParameter(MgcpParameterType.ENDPOINT_ID)); assertEquals(builderSdp.toString(), response.getParameter(MgcpParameterType.SDP)); } }