From 0795ee6130a0581f2ce416e16051d96559dae967 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Wed, 19 Nov 2014 18:03:29 +0900 Subject: [PATCH] Add more test cases to ZlibTest Motivation: Currently, we only test our ZlibEncoders against our ZlibDecoders. It is convenient to write such tests, but it does not necessarily guarantee their correctness. For example, both encoder and decoder might be faulty even if the tests pass. Modifications: Add another test that makes sure that our GZIP encoder generates the GZIP trailer, using the fact that GZIPInputStream raises an EOFException when GZIP trailer is missing. Result: More coverage for GZIP compression --- .../handler/codec/compression/ZlibTest.java | 58 +++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/codec/src/test/java/io/netty/handler/codec/compression/ZlibTest.java b/codec/src/test/java/io/netty/handler/codec/compression/ZlibTest.java index 8f32a7189a..f1bef2bd6d 100644 --- a/codec/src/test/java/io/netty/handler/codec/compression/ZlibTest.java +++ b/codec/src/test/java/io/netty/handler/codec/compression/ZlibTest.java @@ -16,10 +16,12 @@ package io.netty.handler.codec.compression; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufInputStream; import io.netty.buffer.Unpooled; import io.netty.channel.embedded.EmbeddedChannel; import io.netty.util.CharsetUtil; import io.netty.util.ReferenceCountUtil; +import io.netty.util.internal.EmptyArrays; import io.netty.util.internal.ThreadLocalRandom; import org.junit.Test; @@ -27,6 +29,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.zip.DeflaterOutputStream; +import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import static org.junit.Assert.*; @@ -88,7 +91,7 @@ public abstract class ZlibTest { protected abstract ZlibDecoder createDecoder(ZlibWrapper wrapper); @Test - public void testGZIP2() throws Exception { + public void testGZ() throws Exception { byte[] bytes = "message".getBytes(CharsetUtil.UTF_8); ByteBuf data = Unpooled.wrappedBuffer(bytes); ByteBuf deflatedData = Unpooled.wrappedBuffer(gzip(bytes)); @@ -217,7 +220,7 @@ public abstract class ZlibTest { } // Test for https://github.com/netty/netty/issues/2572 - private void testCompressLarge2(ZlibWrapper decoderWrapper, byte[] compressed, byte[] data) throws Exception { + private void testDecompressOnly(ZlibWrapper decoderWrapper, byte[] compressed, byte[] data) throws Exception { EmbeddedChannel chDecoder = new EmbeddedChannel(createDecoder(decoderWrapper)); chDecoder.writeInbound(Unpooled.wrappedBuffer(compressed)); assertTrue(chDecoder.finish()); @@ -253,7 +256,7 @@ public abstract class ZlibTest { testCompressNone(ZlibWrapper.ZLIB, ZlibWrapper.ZLIB); testCompressSmall(ZlibWrapper.ZLIB, ZlibWrapper.ZLIB); testCompressLarge(ZlibWrapper.ZLIB, ZlibWrapper.ZLIB); - testCompressLarge2(ZlibWrapper.ZLIB, deflate(BYTES_LARGE2), BYTES_LARGE2); + testDecompressOnly(ZlibWrapper.ZLIB, deflate(BYTES_LARGE2), BYTES_LARGE2); } @Test @@ -268,7 +271,54 @@ public abstract class ZlibTest { testCompressNone(ZlibWrapper.GZIP, ZlibWrapper.GZIP); testCompressSmall(ZlibWrapper.GZIP, ZlibWrapper.GZIP); testCompressLarge(ZlibWrapper.GZIP, ZlibWrapper.GZIP); - testCompressLarge2(ZlibWrapper.GZIP, gzip(BYTES_LARGE2), BYTES_LARGE2); + testDecompressOnly(ZlibWrapper.GZIP, gzip(BYTES_LARGE2), BYTES_LARGE2); + } + + @Test + public void testGZIPCompressOnly() throws Exception { + testGZIPCompressOnly0(null); // Do not write anything; just finish the stream. + testGZIPCompressOnly0(EmptyArrays.EMPTY_BYTES); // Write an empty array. + testGZIPCompressOnly0(BYTES_SMALL); + testGZIPCompressOnly0(BYTES_LARGE); + } + + private void testGZIPCompressOnly0(byte[] data) throws IOException { + EmbeddedChannel chEncoder = new EmbeddedChannel(createEncoder(ZlibWrapper.GZIP)); + if (data != null) { + chEncoder.writeOutbound(Unpooled.wrappedBuffer(data)); + } + assertTrue(chEncoder.finish()); + + ByteBuf encoded = Unpooled.buffer(); + for (;;) { + ByteBuf buf = chEncoder.readOutbound(); + if (buf == null) { + break; + } + encoded.writeBytes(buf); + buf.release(); + } + + ByteBuf decoded = Unpooled.buffer(); + GZIPInputStream stream = new GZIPInputStream(new ByteBufInputStream(encoded)); + byte[] buf = new byte[8192]; + for (;;) { + int readBytes = stream.read(buf); + if (readBytes < 0) { + break; + } + decoded.writeBytes(buf, 0, readBytes); + } + stream.close(); + + if (data != null) { + assertEquals(Unpooled.wrappedBuffer(data), decoded); + } else { + assertFalse(decoded.isReadable()); + } + + encoded.release(); + decoded.release(); } @Test