|
17 | 17 | */ |
18 | 18 | package org.apache.hadoop.io.compress.snappy; |
19 | 19 |
|
| 20 | +import static org.assertj.core.api.Assertions.assertThat; |
20 | 21 | import static org.junit.Assert.assertEquals; |
21 | 22 | import static org.junit.Assert.assertTrue; |
22 | 23 | import static org.junit.Assert.fail; |
|
44 | 45 | import org.junit.Assert; |
45 | 46 | import org.junit.Before; |
46 | 47 | import org.junit.Test; |
| 48 | +import org.slf4j.Logger; |
| 49 | +import org.slf4j.LoggerFactory; |
47 | 50 |
|
48 | 51 | import static org.junit.Assume.*; |
49 | 52 |
|
50 | 53 | public class TestSnappyCompressorDecompressor { |
51 | 54 |
|
| 55 | + public static final Logger LOG = |
| 56 | + LoggerFactory.getLogger(TestSnappyCompressorDecompressor.class); |
| 57 | + |
52 | 58 | @Before |
53 | 59 | public void before() { |
54 | 60 | assumeTrue(SnappyCodec.isNativeCodeLoaded()); |
@@ -167,40 +173,41 @@ public void testSnappyDecompressorCompressAIOBException() { |
167 | 173 | } |
168 | 174 |
|
169 | 175 | @Test |
170 | | - public void testSnappyCompressDecompress() { |
| 176 | + public void testSnappyCompressDecompress() throws Exception { |
171 | 177 | int BYTE_SIZE = 1024 * 54; |
172 | 178 | byte[] bytes = BytesGenerator.get(BYTE_SIZE); |
173 | 179 | SnappyCompressor compressor = new SnappyCompressor(); |
174 | | - try { |
175 | | - compressor.setInput(bytes, 0, bytes.length); |
176 | | - assertTrue("SnappyCompressDecompress getBytesRead error !!!", |
177 | | - compressor.getBytesRead() > 0); |
178 | | - assertTrue( |
179 | | - "SnappyCompressDecompress getBytesWritten before compress error !!!", |
180 | | - compressor.getBytesWritten() == 0); |
181 | | - |
182 | | - byte[] compressed = new byte[BYTE_SIZE]; |
183 | | - int cSize = compressor.compress(compressed, 0, compressed.length); |
184 | | - assertTrue( |
185 | | - "SnappyCompressDecompress getBytesWritten after compress error !!!", |
186 | | - compressor.getBytesWritten() > 0); |
187 | | - |
188 | | - SnappyDecompressor decompressor = new SnappyDecompressor(BYTE_SIZE); |
189 | | - // set as input for decompressor only compressed data indicated with cSize |
190 | | - decompressor.setInput(compressed, 0, cSize); |
191 | | - byte[] decompressed = new byte[BYTE_SIZE]; |
192 | | - decompressor.decompress(decompressed, 0, decompressed.length); |
193 | | - |
194 | | - assertTrue("testSnappyCompressDecompress finished error !!!", |
195 | | - decompressor.finished()); |
196 | | - Assert.assertArrayEquals(bytes, decompressed); |
197 | | - compressor.reset(); |
198 | | - decompressor.reset(); |
199 | | - assertTrue("decompressor getRemaining error !!!", |
200 | | - decompressor.getRemaining() == 0); |
201 | | - } catch (Exception e) { |
202 | | - fail("testSnappyCompressDecompress ex error!!!"); |
203 | | - } |
| 180 | + compressor.setInput(bytes, 0, bytes.length); |
| 181 | + assertTrue("SnappyCompressDecompress getBytesRead error !!!", |
| 182 | + compressor.getBytesRead() > 0); |
| 183 | + assertEquals( |
| 184 | + "SnappyCompressDecompress getBytesWritten before compress error !!!", |
| 185 | + 0, compressor.getBytesWritten()); |
| 186 | + |
| 187 | + // snappy compression may increase data size. |
| 188 | + // This calculation comes from "Snappy::MaxCompressedLength(size_t)" |
| 189 | + int maxSize = 32 + BYTE_SIZE + BYTE_SIZE / 6; |
| 190 | + byte[] compressed = new byte[maxSize]; |
| 191 | + int cSize = compressor.compress(compressed, 0, compressed.length); |
| 192 | + LOG.info("input size: {}", BYTE_SIZE); |
| 193 | + LOG.info("compressed size: {}", cSize); |
| 194 | + assertTrue( |
| 195 | + "SnappyCompressDecompress getBytesWritten after compress error !!!", |
| 196 | + compressor.getBytesWritten() > 0); |
| 197 | + |
| 198 | + SnappyDecompressor decompressor = new SnappyDecompressor(); |
| 199 | + // set as input for decompressor only compressed data indicated with cSize |
| 200 | + decompressor.setInput(compressed, 0, cSize); |
| 201 | + byte[] decompressed = new byte[BYTE_SIZE]; |
| 202 | + decompressor.decompress(decompressed, 0, decompressed.length); |
| 203 | + |
| 204 | + assertTrue("testSnappyCompressDecompress finished error !!!", |
| 205 | + decompressor.finished()); |
| 206 | + Assert.assertArrayEquals(bytes, decompressed); |
| 207 | + compressor.reset(); |
| 208 | + decompressor.reset(); |
| 209 | + assertEquals("decompressor getRemaining error !!!", |
| 210 | + 0, decompressor.getRemaining()); |
204 | 211 | } |
205 | 212 |
|
206 | 213 | @Test |
@@ -278,7 +285,38 @@ public void testSnappyBlockCompression() { |
278 | 285 | fail("testSnappyBlockCompression ex error !!!"); |
279 | 286 | } |
280 | 287 | } |
281 | | - |
| 288 | + |
| 289 | + @Test |
| 290 | + // The buffer size is smaller than the input. |
| 291 | + public void testSnappyCompressDecompressWithSmallBuffer() throws Exception { |
| 292 | + int inputSize = 1024 * 50; |
| 293 | + int bufferSize = 512; |
| 294 | + ByteArrayOutputStream out = new ByteArrayOutputStream(); |
| 295 | + byte[] buffer = new byte[bufferSize]; |
| 296 | + byte[] input = BytesGenerator.get(inputSize); |
| 297 | + |
| 298 | + SnappyCompressor compressor = new SnappyCompressor(); |
| 299 | + compressor.setInput(input, 0, inputSize); |
| 300 | + compressor.finish(); |
| 301 | + while (!compressor.finished()) { |
| 302 | + int len = compressor.compress(buffer, 0, buffer.length); |
| 303 | + out.write(buffer, 0, len); |
| 304 | + } |
| 305 | + byte[] compressed = out.toByteArray(); |
| 306 | + assertThat(compressed).hasSizeGreaterThan(0); |
| 307 | + out.reset(); |
| 308 | + |
| 309 | + SnappyDecompressor decompressor = new SnappyDecompressor(); |
| 310 | + decompressor.setInput(compressed, 0, compressed.length); |
| 311 | + while (!decompressor.finished()) { |
| 312 | + int len = decompressor.decompress(buffer, 0, buffer.length); |
| 313 | + out.write(buffer, 0, len); |
| 314 | + } |
| 315 | + byte[] decompressed = out.toByteArray(); |
| 316 | + |
| 317 | + assertThat(decompressed).isEqualTo(input); |
| 318 | + } |
| 319 | + |
282 | 320 | private void compressDecompressLoop(int rawDataSize) throws IOException { |
283 | 321 | byte[] rawData = BytesGenerator.get(rawDataSize); |
284 | 322 | byte[] compressedResult = new byte[rawDataSize+20]; |
|
0 commit comments