/* * Copyright 2010 david varnes. * * Licensed under the Apache License, version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.freeswitch.esl.client.transport.message; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.handler.codec.embedder.DecoderEmbedder; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class EslFrameDecoderTest { private final Logger log = LoggerFactory.getLogger( this.getClass() ); private DecoderEmbedder<EslMessage> embedder; @Before public void setupTest() { embedder = new DecoderEmbedder<EslMessage>( new EslFrameDecoder( 64 ) ); } @Test public void simpleMessage() throws Exception { List<String> inputLines = new ArrayList<String>(); inputLines.add( "Content-Type: command/reply" ); inputLines.add( "Reply-Text: +OK event listener enabled plain" ); inputLines.add( "" ); embedder.offer( createInputBuffer( inputLines, true ) ); embedder.finish(); EslMessage result = embedder.poll(); assertNotNull( result ); assertEquals( 2, result.getHeaders().size() ); assertFalse( result.hasContentLength() ); } @Test public void simpleMessageWithContent() throws Exception { List<String> inputLines = new ArrayList<String>(); inputLines.add( "Content-Type: api/response" ); inputLines.add( "Content-Length: 694" ); inputLines.add( "" ); inputLines.add( "=================================================================================================" ); inputLines.add( " Name Type Data State" ); inputLines.add( " internal profile sip:mod_sofia@192.168.1.1:5060 RUNNING (0)" ); inputLines.add( " external profile sip:mod_sofia@yyy.yyy.yyy.yyy:5080 RUNNING (0)" ); inputLines.add( " iinet gateway sip:02xxxxxxxx@sip.nsw.iinet.net.au REGED" ); inputLines.add( " clinic profile sip:mod_sofia@yyy.yyy.yyy.yyy:5070 RUNNING (0)" ); inputLines.add( " 192.168.1.1 alias internal ALIASED" ); inputLines.add( "=================================================================================================" ); embedder.offer( createInputBuffer( inputLines, true ) ); EslMessage result = embedder.poll(); embedder.finish(); assertNotNull( result ); assertEquals( 2, result.getHeaders().size() ); assertTrue( result.hasContentLength() ); assertEquals( 8, result.getBodyLines().size() ); } @Test public void eventWithSecondContentLength() { List<String> inputLines = new ArrayList<String>(); inputLines.add( "Content-Length: 582" ); inputLines.add( "Content-Type: text/event-plain" ); inputLines.add( "" ); inputLines.add( "Job-UUID: 7f4db78a-17d7-11dd-b7a0-db4edd065621" ); inputLines.add( "Job-Command: originate" ); inputLines.add( "Job-Command-Arg: sofia/default/1005%20'%26park'" ); inputLines.add( "Event-Name: BACKGROUND_JOB" ); inputLines.add( "Core-UUID: 42bdf272-16e6-11dd-b7a0-db4edd065621" ); inputLines.add( "FreeSWITCH-Hostname: ser" ); inputLines.add( "FreeSWITCH-IPv4: 192.168.1.104" ); inputLines.add( "FreeSWITCH-IPv6: 127.0.0.1" ); inputLines.add( "Event-Date-Local: 2008-05-02%2007%3A37%3A03" ); inputLines.add( "Event-Date-GMT: Thu,%2001%20May%202008%2023%3A37%3A03%20GMT" ); inputLines.add( "Event-Date-timestamp: 1209685023894968" ); inputLines.add( "Event-Calling-File: mod_event_socket.c" ); inputLines.add( "Event-Calling-Function: api_exec" ); inputLines.add( "Event-Calling-Line-Number: 609" ); inputLines.add( "Content-Length: 41" ); inputLines.add( "" ); inputLines.add( "+OK 7f4de4bc-17d7-11dd-b7a0-db4edd065621" ); embedder.offer( createInputBuffer( inputLines, false ) ); /* * NB .. there is no trailing '\n' in this event */ EslMessage result = embedder.poll(); embedder.finish(); assertNotNull( result ); assertEquals( 2, result.getHeaders().size() ); assertTrue( result.hasContentLength() ); assertEquals( 17, result.getBodyLines().size() ); } private ChannelBuffer createInputBuffer( List<String> inputLines, boolean terminateLastLine ) { ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); Iterator<String> it = inputLines.iterator(); while ( it.hasNext() ) { buffer.writeBytes( it.next().getBytes() ); // only terminate last line if asked if ( it.hasNext() || terminateLastLine ) { buffer.writeByte( '\n' ); } } log.debug( "Created buffer with [{}] bytes", buffer.writerIndex() ); return buffer; } }