blob: 2bef7c3f8bdc07a3ff8c025abd94e0b102a475fd [file] [log] [blame]
package org.codehaus.jackson.impl;
import java.io.*;
import org.codehaus.jackson.*;
import static org.junit.Assert.*;
/**
* Tests for verifying that accessing base64 encoded content works ok.
*/
public class TestJsonParserBinary
extends main.BaseTest
{
/*
/**********************************************************************
/* Unit tests
/**********************************************************************
*/
public void testSimple()
throws IOException
{
// let's test reader (char) based first, then stream (byte)
_testSimple(false);
_testSimple(true);
}
public void testInArray()
throws IOException
{
// let's test reader (char) based first, then stream (byte)
_testInArray(false);
_testInArray(true);
}
public void testWithEscaped() throws IOException
{
// let's test reader (char) based first, then stream (byte)
_testEscaped(false);
_testEscaped(true);
}
/*
/**********************************************************************
/* Actual test methods
/**********************************************************************
*/
private void _testSimple(boolean useStream)
throws IOException
{
/* The usual sample input string, from Thomas Hobbes's "Leviathan"
* (via Wikipedia)
*/
final String RESULT = "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.";
final byte[] RESULT_BYTES = RESULT.getBytes("US-ASCII");
// And here's what should produce it...
final String INPUT_STR =
"TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz"
+"IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg"
+"dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu"
+"dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo"
+"ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4="
;
final String DOC = "\""+INPUT_STR+"\"";
JsonParser jp = _getParser(DOC, useStream);
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
byte[] data = jp.getBinaryValue();
assertNotNull(data);
assertArrayEquals(RESULT_BYTES, data);
}
private void _testInArray(boolean useStream)
throws IOException
{
JsonFactory jf = new JsonFactory();
final int entryCount = 7;
StringWriter sw = new StringWriter();
JsonGenerator jg = jf.createJsonGenerator(sw);
jg.writeStartArray();
byte[][] entries = new byte[entryCount][];
for (int i = 0; i < entryCount; ++i) {
byte[] b = new byte[200 + i * 100];
for (int x = 0; x < b.length; ++x) {
b[x] = (byte) (i + x);
}
entries[i] = b;
jg.writeBinary(b);
}
jg.writeEndArray();
jg.close();
JsonParser jp = _getParser(sw.toString(), useStream);
assertToken(JsonToken.START_ARRAY, jp.nextToken());
for (int i = 0; i < entryCount; ++i) {
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
byte[] b = jp.getBinaryValue();
assertArrayEquals(entries[i], b);
}
assertToken(JsonToken.END_ARRAY, jp.nextToken());
}
private void _testEscaped(boolean useStream) throws IOException
{
// Input: "Test!" -> "VGVzdCE="
// First, try with embedded linefeed half-way through:
String DOC = quote("VGVz\\ndCE="); // note: must double-quote to get linefeed
JsonParser jp = _getParser(DOC, useStream);
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
byte[] b = jp.getBinaryValue();
assertEquals("Test!", new String(b, "US-ASCII"));
assertNull(jp.nextToken());
jp.close();
// and then with escaped chars
// DOC = quote("V\\u0047V\\u007AdCE="); // note: must escape backslash...
DOC = quote("V\\u0047V\\u007AdCE="); // note: must escape backslash...
jp = _getParser(DOC, useStream);
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
b = jp.getBinaryValue();
assertEquals("Test!", new String(b, "US-ASCII"));
assertNull(jp.nextToken());
jp.close();
}
/*
/**********************************************************************
/* Other helper methods
/**********************************************************************
*/
private JsonParser _getParser(String doc, boolean useStream)
throws IOException
{
JsonFactory jf = new JsonFactory();
if (useStream) {
return jf.createJsonParser(doc.getBytes("UTF-8"));
}
return jf.createJsonParser(new StringReader(doc));
}
}