From 53941560446ffddec4ac17b245884de7a557e474 Mon Sep 17 00:00:00 2001 From: mariofusco Date: Wed, 30 Aug 2023 14:45:34 +0200 Subject: [PATCH] improve tests checking that pooled BufferRecycler is properly acquired/released --- .../jackson/core/json/JsonGeneratorImpl.java | 4 +++ .../{write => io}/BufferRecyclerPoolTest.java | 33 ++++++++++++++----- 2 files changed, 28 insertions(+), 9 deletions(-) rename src/test/java/com/fasterxml/jackson/core/{write => io}/BufferRecyclerPoolTest.java (60%) diff --git a/src/main/java/com/fasterxml/jackson/core/json/JsonGeneratorImpl.java b/src/main/java/com/fasterxml/jackson/core/json/JsonGeneratorImpl.java index 487b41decc..3aaf01d3c6 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/JsonGeneratorImpl.java +++ b/src/main/java/com/fasterxml/jackson/core/json/JsonGeneratorImpl.java @@ -245,6 +245,10 @@ public JacksonFeatureSet getWriteCapabilities() { return JSON_WRITE_CAPABILITIES; } + public IOContext _getIoContext() { + return _ioContext; + } + /* /********************************************************** /* Shared helper methods diff --git a/src/test/java/com/fasterxml/jackson/core/write/BufferRecyclerPoolTest.java b/src/test/java/com/fasterxml/jackson/core/io/BufferRecyclerPoolTest.java similarity index 60% rename from src/test/java/com/fasterxml/jackson/core/write/BufferRecyclerPoolTest.java rename to src/test/java/com/fasterxml/jackson/core/io/BufferRecyclerPoolTest.java index e629eb6ea2..9f6fe9d568 100644 --- a/src/test/java/com/fasterxml/jackson/core/write/BufferRecyclerPoolTest.java +++ b/src/test/java/com/fasterxml/jackson/core/io/BufferRecyclerPoolTest.java @@ -1,8 +1,10 @@ -package com.fasterxml.jackson.core.write; +package com.fasterxml.jackson.core.io; import com.fasterxml.jackson.core.BaseTest; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.json.JsonGeneratorImpl; +import com.fasterxml.jackson.core.util.BufferRecycler; import com.fasterxml.jackson.core.util.BufferRecyclerPool; import java.io.IOException; @@ -11,36 +13,49 @@ public class BufferRecyclerPoolTest extends BaseTest { public void testNoOp() { - checkBufferRecyclerPoolImpl(BufferRecyclerPool.NonRecyclingPool.shared()); + // no-op pool doesn't actually pool anything, so avoid checking it + checkBufferRecyclerPoolImpl(BufferRecyclerPool.NonRecyclingPool.shared(), false); } public void testThreadLocal() { - checkBufferRecyclerPoolImpl(BufferRecyclerPool.ThreadLocalPool.shared()); + checkBufferRecyclerPoolImpl(BufferRecyclerPool.ThreadLocalPool.shared(), true); } public void testLockFree() { - checkBufferRecyclerPoolImpl(BufferRecyclerPool.LockFreePool.nonShared()); + checkBufferRecyclerPoolImpl(BufferRecyclerPool.LockFreePool.shared(), true); } public void testConcurrentDequeue() { - checkBufferRecyclerPoolImpl(BufferRecyclerPool.ConcurrentDequePool.nonShared()); + checkBufferRecyclerPoolImpl(BufferRecyclerPool.ConcurrentDequePool.shared(), true); } - private void checkBufferRecyclerPoolImpl(BufferRecyclerPool pool) { + private void checkBufferRecyclerPoolImpl(BufferRecyclerPool pool, boolean checkPooledResource) { JsonFactory jsonFactory = JsonFactory.builder() .bufferRecyclerPool(pool) .build(); - assertEquals(6, write("test", jsonFactory)); + BufferRecycler usedBufferRecycler = write("test", jsonFactory, 6); + if (checkPooledResource) { + // acquire the pooled BufferRecycler again and check if it is the same instance used before + BufferRecycler pooledBufferRecycler = pool.acquireBufferRecycler(); + try { + assertSame(usedBufferRecycler, pooledBufferRecycler); + } finally { + pooledBufferRecycler.release(); + } + } } - protected final int write(Object value, JsonFactory jsonFactory) { + protected final BufferRecycler write(Object value, JsonFactory jsonFactory, int expectedSize) { + BufferRecycler bufferRecycler; NopOutputStream out = new NopOutputStream(); try (JsonGenerator gen = jsonFactory.createGenerator(out)) { + bufferRecycler = ((JsonGeneratorImpl) gen)._getIoContext()._bufferRecycler; gen.writeObject(value); } catch (IOException e) { throw new RuntimeException(e); } - return out.size(); + assertEquals(expectedSize, out.size); + return bufferRecycler; } public class NopOutputStream extends OutputStream {