/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.camel.component.lumberjack.io; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import io.netty.buffer.ByteBuf; import io.netty.channel.embedded.EmbeddedChannel; import org.junit.Test; import static io.netty.buffer.Unpooled.buffer; import static org.apache.camel.component.lumberjack.io.LumberjackConstants.TYPE_ACKNOWLEDGE; import static org.apache.camel.component.lumberjack.io.LumberjackConstants.VERSION_V2; import static org.junit.Assert.assertEquals; public class LumberjackChannelInitializerTest { @Test public void shouldDecodeTwoWindowsWithCompressedMessages() throws Exception { // Given a properly configured netty channel List<Object> messages = new ArrayList<>(); EmbeddedChannel channel = new EmbeddedChannel(new LumberjackChannelInitializer(null, null, (payload, callback) -> { messages.add(payload); callback.onComplete(true); })); // When writing the stream byte per byte in order to ensure that we support splits everywhere // It contains 2 windows with compressed messages writeResourceBytePerByte(channel, "window10"); writeResourceBytePerByte(channel, "window15"); // Then we must have 25 messages with only maps assertEquals(25, messages.size()); // And the first map should contains valid data (we're assuming it's also valid for the other ones) Map first = (Map) messages.get(0); assertEquals("log", first.get("type")); assertEquals("/home/qatest/collectNetwork/log/data-integration/00000000-f000-0000-1541-8da26f200001/absorption.log", first.get("source")); // And we should have replied twice (one per window) assertEquals(2, channel.outboundMessages().size()); checkAck((ByteBuf) channel.outboundMessages().poll(), 10); checkAck((ByteBuf) channel.outboundMessages().poll(), 15); } private void writeResourceBytePerByte(EmbeddedChannel channel, String resource) throws IOException { try (InputStream stream = getClass().getResourceAsStream(resource)) { int input; while ((input = stream.read()) != -1) { ByteBuf buffer = buffer(1, 1); buffer.writeByte(input); channel.writeInbound(buffer); } } } private void checkAck(ByteBuf buf, int sequence) { assertEquals("version", (short) VERSION_V2, buf.readUnsignedByte()); assertEquals("frame", (short) TYPE_ACKNOWLEDGE, buf.readUnsignedByte()); assertEquals("sequence", sequence, buf.readInt()); assertEquals("remaining", 0, buf.readableBytes()); } }