| package org.brotli.wrapper.enc; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import org.brotli.integration.BrotliJniTestBase; |
| import org.brotli.integration.BundleHelper; |
| import org.brotli.wrapper.dec.BrotliInputStream; |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.FileInputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.nio.Buffer; |
| import java.nio.ByteBuffer; |
| import java.nio.channels.Channels; |
| import java.nio.channels.WritableByteChannel; |
| import java.util.List; |
| import junit.framework.TestCase; |
| import junit.framework.TestSuite; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.AllTests; |
| |
| /** Tests for {@link org.brotli.wrapper.enc.BrotliEncoderChannel}. */ |
| @RunWith(AllTests.class) |
| public class BrotliEncoderChannelTest extends BrotliJniTestBase { |
| |
| private enum TestMode { |
| WRITE_ALL, |
| WRITE_CHUNKS |
| } |
| |
| private static final int CHUNK_SIZE = 256; |
| |
| static InputStream getBundle() throws IOException { |
| return new FileInputStream(System.getProperty("TEST_BUNDLE")); |
| } |
| |
| /** Creates a test suite. */ |
| public static TestSuite suite() throws IOException { |
| TestSuite suite = new TestSuite(); |
| InputStream bundle = getBundle(); |
| try { |
| List<String> entries = BundleHelper.listEntries(bundle); |
| for (String entry : entries) { |
| suite.addTest(new ChannleTestCase(entry, TestMode.WRITE_ALL)); |
| suite.addTest(new ChannleTestCase(entry, TestMode.WRITE_CHUNKS)); |
| } |
| } finally { |
| bundle.close(); |
| } |
| return suite; |
| } |
| |
| /** Test case with a unique name. */ |
| static class ChannleTestCase extends TestCase { |
| final String entryName; |
| final TestMode mode; |
| ChannleTestCase(String entryName, TestMode mode) { |
| super("BrotliEncoderChannelTest." + entryName + "." + mode.name()); |
| this.entryName = entryName; |
| this.mode = mode; |
| } |
| |
| @Override |
| protected void runTest() throws Throwable { |
| BrotliEncoderChannelTest.run(entryName, mode); |
| } |
| } |
| |
| private static void run(String entryName, TestMode mode) throws Throwable { |
| InputStream bundle = getBundle(); |
| byte[] original; |
| try { |
| original = BundleHelper.readEntry(bundle, entryName); |
| } finally { |
| bundle.close(); |
| } |
| if (original == null) { |
| throw new RuntimeException("Can't read bundle entry: " + entryName); |
| } |
| |
| if ((mode == TestMode.WRITE_CHUNKS) && (original.length <= CHUNK_SIZE)) { |
| return; |
| } |
| |
| ByteArrayOutputStream dst = new ByteArrayOutputStream(); |
| WritableByteChannel encoder = new BrotliEncoderChannel(Channels.newChannel(dst)); |
| ByteBuffer src = ByteBuffer.wrap(original); |
| try { |
| switch (mode) { |
| case WRITE_ALL: |
| encoder.write(src); |
| break; |
| |
| case WRITE_CHUNKS: |
| while (src.hasRemaining()) { |
| int limit = Math.min(CHUNK_SIZE, src.remaining()); |
| ByteBuffer slice = src.slice(); |
| ((Buffer) slice).limit(limit); |
| ((Buffer) src).position(src.position() + limit); |
| encoder.write(slice); |
| } |
| break; |
| } |
| } finally { |
| encoder.close(); |
| } |
| |
| InputStream decoder = new BrotliInputStream(new ByteArrayInputStream(dst.toByteArray())); |
| try { |
| long originalCrc = BundleHelper.fingerprintStream(new ByteArrayInputStream(original)); |
| long crc = BundleHelper.fingerprintStream(decoder); |
| assertEquals(originalCrc, crc); |
| } finally { |
| decoder.close(); |
| } |
| } |
| } |