/*
* Copyright 2012 The Netty Project
*
* The Netty Project 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 io.netty.handler.codec.compression;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.embedded.EmbeddedChannel;
import org.junit.Before;
import org.junit.Test;
import static io.netty.util.ReferenceCountUtil.releaseLater;
import static org.junit.Assert.*;
public class SnappyFramedEncoderTest {
private EmbeddedChannel channel;
@Before
public void setUp() {
channel = new EmbeddedChannel(new SnappyFramedEncoder());
}
@Test
public void testSmallAmountOfDataIsUncompressed() throws Exception {
ByteBuf in = Unpooled.wrappedBuffer(new byte[] {
'n', 'e', 't', 't', 'y'
});
channel.writeOutbound(in);
assertTrue(channel.finish());
ByteBuf expected = Unpooled.wrappedBuffer(new byte[] {
(byte) 0xff, 0x06, 0x00, 0x00, 0x73, 0x4e, 0x61, 0x50, 0x70, 0x59,
0x01, 0x09, 0x00, 0x00, 0x6f, -0x68, -0x7e, -0x5e, 'n', 'e', 't', 't', 'y'
});
assertEquals(releaseLater(expected), releaseLater(channel.readOutbound()));
}
@Test
public void testLargeAmountOfDataIsCompressed() throws Exception {
ByteBuf in = Unpooled.wrappedBuffer(new byte[] {
'n', 'e', 't', 't', 'y', 'n', 'e', 't', 't', 'y',
'n', 'e', 't', 't', 'y', 'n', 'e', 't', 't', 'y'
});
channel.writeOutbound(in);
assertTrue(channel.finish());
ByteBuf expected = Unpooled.wrappedBuffer(new byte[] {
(byte) 0xff, 0x06, 0x00, 0x00, 0x73, 0x4e, 0x61, 0x50, 0x70, 0x59,
0x00, 0x0E, 0x00, 0x00, 0x3b, 0x36, -0x7f, 0x37,
0x14, 0x10,
'n', 'e', 't', 't', 'y',
0x3a, 0x05, 0x00
});
assertEquals(releaseLater(expected), releaseLater(channel.readOutbound()));
}
@Test
public void testStreamStartIsOnlyWrittenOnce() throws Exception {
ByteBuf in = Unpooled.wrappedBuffer(new byte[] {
'n', 'e', 't', 't', 'y'
});
channel.writeOutbound(in.copy());
in.readerIndex(0); // rewind the buffer to write the same data
channel.writeOutbound(in.copy());
assertTrue(channel.finish());
ByteBuf expected = Unpooled.wrappedBuffer(new byte[] {
(byte) 0xff, 0x06, 0x00, 0x00, 0x73, 0x4e, 0x61, 0x50, 0x70, 0x59,
0x01, 0x09, 0x00, 0x00, 0x6f, -0x68, -0x7e, -0x5e, 'n', 'e', 't', 't', 'y',
0x01, 0x09, 0x00, 0x00, 0x6f, -0x68, -0x7e, -0x5e, 'n', 'e', 't', 't', 'y',
});
CompositeByteBuf actual = Unpooled.compositeBuffer();
for (;;) {
ByteBuf m = (ByteBuf) channel.readOutbound();
if (m == null) {
break;
}
actual.addComponent(m);
actual.writerIndex(actual.writerIndex() + m.readableBytes());
}
assertEquals(releaseLater(expected), releaseLater(actual));
in.release();
}
/**
* This test asserts that if we have a remainder after emitting a copy that
* is less than 4 bytes (ie. the minimum required for a copy), we should
* emit a literal rather than trying to see if we can emit another copy.
*/
@Test
public void testInputBufferOverseek() throws Exception {
ByteBuf in = Unpooled.wrappedBuffer(new byte[] {
11, 0, // literal
0, 0, 0, 0, // 1st copy
16, 65, 96, 119, -22, 79, -43, 76, -75, -93,
11, 104, 96, -99, 126, -98, 27, -36, 40, 117,
-65, -3, -57, -83, -58, 7, 114, -14, 68, -122,
124, 88, 118, 54, 45, -26, 117, 13, -45, -9,
60, -73, -53, -44, 53, 68, -77, -71, 109, 43,
-38, 59, 100, -12, -87, 44, -106, 123, -107, 38,
13, -117, -23, -49, 29, 21, 26, 66, 1, -1,
-1, // literal
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, // 2nd copy
66, 0, -104, -49, 16, -120, 22, 8, -52, -54,
-102, -52, -119, -124, -92, -71, 101, -120, -52, -48,
45, -26, -24, 26, 41, -13, 36, 64, -47, 15,
-124, -7, -16, 91, 96, 0, -93, -42, 101, 20,
-74, 39, -124, 35, 43, -49, -21, -92, -20, -41,
79, 41, 110, -105, 42, -96, 90, -9, -100, -22,
-62, 91, 2, 35, 113, 117, -71, 66, 1, // literal
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, // copy
-1, 1 // remainder
});
channel.writeOutbound(in);
assertTrue(channel.finish());
ByteBuf out = (ByteBuf) channel.readOutbound();
out.release();
}
}