blob: fbd71267277dbcf173df1821c5f9d863064080b8 [file] [log] [blame]
package com.fasterxml.jackson.core.read;
import static org.junit.Assert.assertArrayEquals;
import java.io.*;
import com.fasterxml.jackson.core.*;
public class Base64BinaryParsingTest
extends com.fasterxml.jackson.core.BaseTest
{
public void testBase64UsingInputStream() throws Exception
{
_testBase64Text(MODE_INPUT_STREAM);
_testBase64Text(MODE_INPUT_STREAM_THROTTLED);
_testBase64Text(MODE_DATA_INPUT);
}
public void testBase64UsingReader() throws Exception
{
_testBase64Text(MODE_READER);
}
public void testStreaming() throws IOException
{
_testStreaming(MODE_INPUT_STREAM);
_testStreaming(MODE_INPUT_STREAM_THROTTLED);
_testStreaming(MODE_DATA_INPUT);
_testStreaming(MODE_READER);
}
/*
/**********************************************************
/* Test helper methods
/**********************************************************
*/
@SuppressWarnings("resource")
public void _testBase64Text(int mode) throws Exception
{
// let's actually iterate over sets of encoding modes, lengths
final int[] LENS = { 1, 2, 3, 4, 7, 9, 32, 33, 34, 35 };
final Base64Variant[] VARIANTS = {
Base64Variants.MIME,
Base64Variants.MIME_NO_LINEFEEDS,
Base64Variants.MODIFIED_FOR_URL,
Base64Variants.PEM
};
JsonFactory jsonFactory = new JsonFactory();
final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
StringWriter chars = null;
for (int len : LENS) {
byte[] input = new byte[len];
for (int i = 0; i < input.length; ++i) {
input[i] = (byte) i;
}
for (Base64Variant variant : VARIANTS) {
JsonGenerator g;
if (mode == MODE_READER) {
chars = new StringWriter();
g = jsonFactory.createGenerator(chars);
} else {
bytes.reset();
g = jsonFactory.createGenerator(bytes, JsonEncoding.UTF8);
}
g.writeBinary(variant, input, 0, input.length);
g.close();
JsonParser p;
if (mode == MODE_READER) {
p = jsonFactory.createParser(chars.toString());
} else {
p = createParser(jsonFactory, mode, bytes.toByteArray());
}
assertToken(JsonToken.VALUE_STRING, p.nextToken());
byte[] data = null;
try {
data = p.getBinaryValue(variant);
} catch (Exception e) {
IOException ioException = new IOException("Failed (variant "+variant+", data length "+len+"): "+e.getMessage());
ioException.initCause(e);
throw ioException;
}
assertNotNull(data);
assertArrayEquals(data, input);
if (mode != MODE_DATA_INPUT) { // no look-ahead for DataInput
assertNull(p.nextToken());
}
p.close();
}
}
}
private byte[] _generateData(int size)
{
byte[] result = new byte[size];
for (int i = 0; i < size; ++i) {
result[i] = (byte) (i % 255);
}
return result;
}
private void _testStreaming(int mode) throws IOException
{
final int[] SIZES = new int[] {
1, 2, 3, 4, 5, 6,
7, 8, 12,
100, 350, 1900, 6000, 19000, 65000,
139000
};
JsonFactory jsonFactory = new JsonFactory();
final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
StringWriter chars = null;
for (int size : SIZES) {
byte[] data = _generateData(size);
JsonGenerator g;
if (mode == MODE_READER) {
chars = new StringWriter();
g = jsonFactory.createGenerator(chars);
} else {
bytes.reset();
g = jsonFactory.createGenerator(bytes, JsonEncoding.UTF8);
}
g.writeStartObject();
g.writeFieldName("b");
g.writeBinary(data);
g.writeEndObject();
g.close();
// and verify
JsonParser p;
if (mode == MODE_READER) {
p = jsonFactory.createParser(chars.toString());
} else {
p = createParser(jsonFactory, mode, bytes.toByteArray());
}
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("b", p.getCurrentName());
assertToken(JsonToken.VALUE_STRING, p.nextToken());
ByteArrayOutputStream result = new ByteArrayOutputStream(size);
int gotten = p.readBinaryValue(result);
assertEquals(size, gotten);
assertArrayEquals(data, result.toByteArray());
assertToken(JsonToken.END_OBJECT, p.nextToken());
if (mode != MODE_DATA_INPUT) { // no look-ahead for DataInput
assertNull(p.nextToken());
}
p.close();
}
}
}