blob: 91ea4263bfff815b6b566b69c3346d9bed566ebf [file] [log] [blame]
package org.codehaus.jackson.main;
import main.BaseTest;
import org.codehaus.jackson.*;
import java.io.*;
/**
* Set of basic unit tests that verify aspect of closing a
* {@link JsonGenerator} instance. This includes both closing
* of physical resources (target), and logical content
* (json content tree)
*<p>
* Specifically, features
* <code>JsonGenerator.Feature#AUTO_CLOSE_TARGET</code>
* and
* <code>JsonGenerator.Feature.AUTO_CLOSE_JSON_CONTENT</code>
* are tested.
*/
public class TestGeneratorClosing
extends BaseTest
{
/*
/**********************************************************
/* Helper classes
/**********************************************************
*/
final static class MyWriter extends StringWriter
{
boolean mIsClosed = false;
public MyWriter() { }
@Override
public void close() throws IOException {
mIsClosed = true;
super.close();
}
public boolean isClosed() { return mIsClosed; }
}
final static class MyStream extends ByteArrayOutputStream
{
boolean mIsClosed = false;
public MyStream() { }
@Override
public void close() throws IOException {
mIsClosed = true;
super.close();
}
public boolean isClosed() { return mIsClosed; }
}
static class MyBytes extends ByteArrayOutputStream
{
public int flushed = 0;
@Override
public void flush() throws IOException
{
++flushed;
super.flush();
}
}
static class MyChars extends StringWriter
{
public int flushed = 0;
@Override
public void flush()
{
++flushed;
super.flush();
}
}
/*
/**********************************************************
/* Unit tests
/**********************************************************
*/
/**
* This unit test checks the default behaviour; with no auto-close, no
* automatic closing should occur, nor explicit one unless specific
* forcing method is used.
*/
public void testNoAutoCloseGenerator()
throws Exception
{
JsonFactory f = new JsonFactory();
// Check the default settings
assertTrue(f.isEnabled(JsonGenerator.Feature.AUTO_CLOSE_TARGET));
// then change
f.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
assertFalse(f.isEnabled(JsonGenerator.Feature.AUTO_CLOSE_TARGET));
MyWriter output = new MyWriter();
JsonGenerator jg = f.createJsonGenerator(output);
// shouldn't be closed to begin with...
assertFalse(output.isClosed());
jg.writeNumber(39);
// regular close won't close it either:
jg.close();
assertFalse(output.isClosed());
}
public void testCloseGenerator()
throws Exception
{
JsonFactory f = new JsonFactory();
f.enable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
MyWriter output = new MyWriter();
JsonGenerator jg = f.createJsonGenerator(output);
// shouldn't be closed to begin with...
assertFalse(output.isClosed());
jg.writeNumber(39);
// but close() should now close the writer
jg.close();
assertTrue(output.isClosed());
}
public void testNoAutoCloseOutputStream()
throws Exception
{
JsonFactory f = new JsonFactory();
f.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
MyStream output = new MyStream();
JsonGenerator jg = f.createJsonGenerator(output, JsonEncoding.UTF8);
assertFalse(output.isClosed());
jg.writeNumber(39);
jg.close();
assertFalse(output.isClosed());
}
public void testAutoCloseArraysAndObjects()
throws Exception
{
JsonFactory f = new JsonFactory();
// let's verify default setting, first:
assertTrue(f.isEnabled(JsonGenerator.Feature.AUTO_CLOSE_JSON_CONTENT));
StringWriter sw = new StringWriter();
// First, test arrays:
JsonGenerator jg = f.createJsonGenerator(sw);
jg.writeStartArray();
jg.close();
assertEquals("[]", sw.toString());
// Then objects
sw = new StringWriter();
jg = f.createJsonGenerator(sw);
jg.writeStartObject();
jg.close();
assertEquals("{}", sw.toString());
}
public void testNoAutoCloseArraysAndObjects()
throws Exception
{
JsonFactory f = new JsonFactory();
f.disable(JsonGenerator.Feature.AUTO_CLOSE_JSON_CONTENT);
StringWriter sw = new StringWriter();
JsonGenerator jg = f.createJsonGenerator(sw);
jg.writeStartArray();
jg.close();
// shouldn't close
assertEquals("[", sw.toString());
// Then objects
sw = new StringWriter();
jg = f.createJsonGenerator(sw);
jg.writeStartObject();
jg.close();
assertEquals("{", sw.toString());
}
// [JACKSON-401]
public void testAutoFlushOrNot() throws Exception
{
JsonFactory f = new JsonFactory();
assertTrue(f.isEnabled(JsonGenerator.Feature.FLUSH_PASSED_TO_STREAM));
MyChars sw = new MyChars();
JsonGenerator jg = f.createJsonGenerator(sw);
jg.writeStartArray();
jg.writeEndArray();
assertEquals(0, sw.flushed);
jg.flush();
assertEquals(1, sw.flushed);
jg.close();
// ditto with stream
MyBytes bytes = new MyBytes();
jg = f.createJsonGenerator(bytes, JsonEncoding.UTF8);
jg.writeStartArray();
jg.writeEndArray();
assertEquals(0, bytes.flushed);
jg.flush();
assertEquals(1, bytes.flushed);
assertEquals(2, bytes.toByteArray().length);
jg.close();
// then disable and we should not see flushing again...
f.disable(JsonGenerator.Feature.FLUSH_PASSED_TO_STREAM);
// first with a Writer
sw = new MyChars();
jg = f.createJsonGenerator(sw);
jg.writeStartArray();
jg.writeEndArray();
assertEquals(0, sw.flushed);
jg.flush();
assertEquals(0, sw.flushed);
jg.close();
assertEquals("[]", sw.toString());
// and then with OutputStream
bytes = new MyBytes();
jg = f.createJsonGenerator(bytes, JsonEncoding.UTF8);
jg.writeStartArray();
jg.writeEndArray();
assertEquals(0, bytes.flushed);
jg.flush();
assertEquals(0, bytes.flushed);
jg.close();
assertEquals(2, bytes.toByteArray().length);
}
}