ByteArrayBuilderTest.java

package com.fasterxml.jackson.core.util;

import java.nio.charset.StandardCharsets;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.base.GeneratorBase;
import com.fasterxml.jackson.core.io.IOContext;

import static org.junit.jupiter.api.Assertions.*;

class ByteArrayBuilderTest extends com.fasterxml.jackson.core.JUnit5TestBase
{
    @Test
    void simple() throws Exception
    {
        ByteArrayBuilder b = new ByteArrayBuilder(null, 20);
        assertArrayEquals(new byte[0], b.toByteArray());

        b.write((byte) 0);
        b.append(1);

        byte[] foo = new byte[98];
        for (int i = 0; i < foo.length; ++i) {
            foo[i] = (byte) (2 + i);
        }
        b.write(foo);

        byte[] result = b.toByteArray();
        assertEquals(100, result.length);
        for (int i = 0; i < 100; ++i) {
            assertEquals(i, result[i]);
        }

        b.release();
        b.close();
    }

    // [core#1195]: Try to verify that BufferRecycler instance is indeed reused
    @Test
    void bufferRecyclerReuse() throws Exception
    {
        JsonFactory f = new JsonFactory();
        BufferRecycler br = new BufferRecycler()
                // need to link with some pool
                .withPool(JsonRecyclerPools.newBoundedPool(3));

        try (ByteArrayBuilder bab = new ByteArrayBuilder(br, 20)) {
            assertSame(br, bab.bufferRecycler());

            try (JsonGenerator g = f.createGenerator(bab)) {
                IOContext ioCtxt = ((GeneratorBase) g).ioContext();
                assertSame(br, ioCtxt.bufferRecycler());
                assertTrue(ioCtxt.bufferRecycler().isLinkedWithPool());

                g.writeStartArray();
                g.writeEndArray();
            }

            // Generator.close() should NOT release buffer recycler
            assertTrue(br.isLinkedWithPool());

            byte[] result = bab.getClearAndRelease();
            assertEquals("[]", new String(result, StandardCharsets.UTF_8));
        }
        // Nor accessing contents
        assertTrue(br.isLinkedWithPool());

        // only explicit release does
        br.releaseToPool();
        assertFalse(br.isLinkedWithPool());
    }
}