Java tutorial
/* * 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 io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.embedded.EmbeddedChannel; 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 EmbeddedChannel embedder; @Before public void setupTest() { embedder = new EmbeddedChannel(new EslFrameDecoder(64)); } @Test public void simpleMessage() throws Exception { List<String> inputLines = new ArrayList<>(); inputLines.add("Content-Type: command/reply"); inputLines.add("Reply-Text: +OK event listener enabled plain"); inputLines.add(""); embedder.writeInbound(createInputBuffer(inputLines, true)); embedder.finish(); EslMessage result = (EslMessage) embedder.readInbound(); assertNotNull(result); assertEquals(2, result.getHeaders().size()); assertFalse(result.hasContentLength()); } @Test public void simpleMessageWithContent() throws Exception { List<String> inputLines = new ArrayList<>(); 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.writeInbound(createInputBuffer(inputLines, true)); EslMessage result = (EslMessage) embedder.readInbound(); 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<>(); 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.writeInbound(createInputBuffer(inputLines, false)); /* * NB .. there is no trailing '\n' in this event */ EslMessage result = (EslMessage) embedder.readInbound(); embedder.finish(); assertNotNull(result); assertEquals(2, result.getHeaders().size()); assertTrue(result.hasContentLength()); assertEquals(17, result.getBodyLines().size()); } private ByteBuf createInputBuffer(List<String> inputLines, boolean terminateLastLine) { ByteBuf buffer = Unpooled.buffer(); 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; } }