/* See LICENSE for licensing and NOTICE for copyright. */ package org.cryptacular.codec; import java.io.File; import java.io.Reader; import java.nio.ByteBuffer; import java.nio.CharBuffer; import org.cryptacular.FailListener; import org.cryptacular.util.ByteUtil; import org.cryptacular.util.HashUtil; import org.cryptacular.util.StreamUtil; import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; /** * Unit test for {@link Base64Decoder} class. * * @author Middleware Services */ @Listeners(FailListener.class) public class Base64DecoderTest { @DataProvider(name = "encoded-data") public Object[][] getEncodedData() { return new Object[][] { new Object[] { new Base64Decoder(), "QWJsZSB3YXMgSSBlcmUgSSBzYXcgZWxiYQ==", ByteUtil.toBytes("Able was I ere I saw elba"), }, new Object[] { new Base64Decoder(), "QWJsZSB3YXMgSSBlcmUgSSBzYXcgZWxiYS4=", ByteUtil.toBytes("Able was I ere I saw elba."), }, new Object[] { new Base64Decoder(), "safx/LW8+SsSy/o3PmCNy4VEm5s=", HashUtil.sha1(ByteUtil.toBytes("t3stUs3r01")), }, new Object[] { new Base64Decoder(true), "safx_LW8-SsSy_o3PmCNy4VEm5s=", HashUtil.sha1(ByteUtil.toBytes("t3stUs3r01")), }, }; } @DataProvider(name = "plaintext-files") public Object[][] getPlaintextFiles() { return new Object[][] { new Object[] {"src/test/resources/plaintexts/lorem-1190.txt"}, new Object[] {"src/test/resources/plaintexts/lorem-1200.txt"}, new Object[] {"src/test/resources/plaintexts/lorem-5000.txt"}, }; } @Test(dataProvider = "encoded-data") public void testDecode(final Base64Decoder decoder, final String data, final byte[] expected) throws Exception { final CharBuffer input = CharBuffer.wrap(data); final ByteBuffer output = ByteBuffer.allocate(decoder.outputSize(input.length())); decoder.decode(input, output); decoder.finalize(output); output.flip(); assertEquals(ByteUtil.toArray(output), expected); } @Test(dataProvider = "plaintext-files") public void testDecodeFile(final String path) throws Exception { final String expected = StreamUtil.readAll(StreamUtil.makeReader(new File(path))); final File file = new File(path + ".b64"); final StringBuilder actual = new StringBuilder(expected.length()); final Reader reader = StreamUtil.makeReader(file); final Base64Decoder decoder = new Base64Decoder(); try { final CharBuffer bufIn = CharBuffer.allocate(1024); final ByteBuffer bufOut = ByteBuffer.allocate(decoder.outputSize(bufIn.capacity())); while (reader.read(bufIn) > 0) { bufIn.flip(); decoder.decode(bufIn, bufOut); bufOut.flip(); actual.append(ByteUtil.toCharBuffer(bufOut)); bufOut.clear(); bufIn.clear(); } decoder.finalize(bufOut); bufOut.flip(); actual.append(ByteUtil.toCharBuffer(bufOut)); } finally { StreamUtil.closeReader(reader); } assertEquals(actual.toString(), expected); } }