Ensure leak aware buffers correctly close the ResourceLeakTracker

Motivation:

We should assert that the leak aware buffers correctly close the ResourceLeakTracker in the unit tests.

Modifications:

- Keep track of NoopResourceLeakTrackers and check if these were closed once the test completes
- Fix bugs in tests so the buffers are all released.

Result:

Better tests for leak aware buffers
This commit is contained in:
Norman Maurer 2016-12-05 08:10:17 +01:00 committed by Norman Maurer
parent 39c0befe99
commit 9d759d2530
4 changed files with 93 additions and 12 deletions

View File

@ -15,6 +15,8 @@
*/
package io.netty.buffer;
import io.netty.util.ResourceLeakTracker;
public class AdvancedLeakAwareByteBufTest extends SimpleLeakAwareByteBufTest {
@Override
@ -23,7 +25,7 @@ public class AdvancedLeakAwareByteBufTest extends SimpleLeakAwareByteBufTest {
}
@Override
protected ByteBuf wrap(ByteBuf buffer) {
return new AdvancedLeakAwareByteBuf(buffer, new NoopResourceLeakTracker<ByteBuf>());
protected SimpleLeakAwareByteBuf wrap(ByteBuf buffer, ResourceLeakTracker<ByteBuf> tracker) {
return new AdvancedLeakAwareByteBuf(buffer, tracker);
}
}

View File

@ -15,11 +15,13 @@
*/
package io.netty.buffer;
import io.netty.util.ResourceLeakTracker;
public class AdvancedLeakAwareCompositeByteBufTest extends SimpleLeakAwareCompositeByteBufTest {
@Override
protected WrappedCompositeByteBuf wrap(CompositeByteBuf buffer) {
return new AdvancedLeakAwareCompositeByteBuf(buffer, new NoopResourceLeakTracker<ByteBuf>());
protected SimpleLeakAwareCompositeByteBuf wrap(CompositeByteBuf buffer, ResourceLeakTracker<ByteBuf> tracker) {
return new AdvancedLeakAwareCompositeByteBuf(buffer, tracker);
}
@Override

View File

@ -15,19 +15,57 @@
*/
package io.netty.buffer;
import org.junit.Assert;
import io.netty.util.ResourceLeakTracker;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayDeque;
import java.util.Queue;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
public class SimpleLeakAwareByteBufTest extends BigEndianHeapByteBufTest {
private final Class<? extends ByteBuf> clazz = leakClass();
private final Queue<NoopResourceLeakTracker<ByteBuf>> trackers = new ArrayDeque<NoopResourceLeakTracker<ByteBuf>>();
@Override
protected final ByteBuf newBuffer(int capacity) {
return wrap(super.newBuffer(capacity));
}
protected ByteBuf wrap(ByteBuf buffer) {
return new SimpleLeakAwareByteBuf(buffer, new NoopResourceLeakTracker<ByteBuf>());
private ByteBuf wrap(ByteBuf buffer) {
NoopResourceLeakTracker<ByteBuf> tracker = new NoopResourceLeakTracker<ByteBuf>();
ByteBuf leakAwareBuf = wrap(buffer, tracker);
trackers.add(tracker);
return leakAwareBuf;
}
protected SimpleLeakAwareByteBuf wrap(ByteBuf buffer, ResourceLeakTracker<ByteBuf> tracker) {
return new SimpleLeakAwareByteBuf(buffer, tracker);
}
@Before
@Override
public void init() {
super.init();
trackers.clear();
}
@After
@Override
public void dispose() {
super.dispose();
for (;;) {
NoopResourceLeakTracker<ByteBuf> tracker = trackers.poll();
if (tracker == null) {
break;
}
assertTrue(tracker.get());
}
}
protected Class<? extends ByteBuf> leakClass() {
@ -48,6 +86,7 @@ public class SimpleLeakAwareByteBufTest extends BigEndianHeapByteBufTest {
public void testWrapReadSlice() {
assertWrapped(newBuffer(8).readSlice(1));
}
@Test
public void testWrapDuplicate() {
assertWrapped(newBuffer(8).duplicate());
@ -55,7 +94,7 @@ public class SimpleLeakAwareByteBufTest extends BigEndianHeapByteBufTest {
protected final void assertWrapped(ByteBuf buf) {
try {
Assert.assertSame(clazz, buf.getClass());
assertSame(clazz, buf.getClass());
} finally {
buf.release();
}

View File

@ -15,16 +15,54 @@
*/
package io.netty.buffer;
import org.junit.Assert;
import io.netty.util.ResourceLeakTracker;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayDeque;
import java.util.Queue;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
public class SimpleLeakAwareCompositeByteBufTest extends WrappedCompositeByteBufTest {
private final Class<? extends ByteBuf> clazz = leakClass();
private final Queue<NoopResourceLeakTracker<ByteBuf>> trackers = new ArrayDeque<NoopResourceLeakTracker<ByteBuf>>();
@Override
protected WrappedCompositeByteBuf wrap(CompositeByteBuf buffer) {
return new SimpleLeakAwareCompositeByteBuf(buffer, new NoopResourceLeakTracker<ByteBuf>());
protected final WrappedCompositeByteBuf wrap(CompositeByteBuf buffer) {
NoopResourceLeakTracker<ByteBuf> tracker = new NoopResourceLeakTracker<ByteBuf>();
WrappedCompositeByteBuf leakAwareBuf = wrap(buffer, tracker);
trackers.add(tracker);
return leakAwareBuf;
}
protected SimpleLeakAwareCompositeByteBuf wrap(CompositeByteBuf buffer, ResourceLeakTracker<ByteBuf> tracker) {
return new SimpleLeakAwareCompositeByteBuf(buffer, tracker);
}
@Before
@Override
public void init() {
super.init();
trackers.clear();
}
@After
@Override
public void dispose() {
super.dispose();
for (;;) {
NoopResourceLeakTracker<ByteBuf> tracker = trackers.poll();
if (tracker == null) {
break;
}
assertTrue(tracker.get());
}
}
protected Class<? extends ByteBuf> leakClass() {
@ -53,7 +91,7 @@ public class SimpleLeakAwareCompositeByteBufTest extends WrappedCompositeByteBuf
protected final void assertWrapped(ByteBuf buf) {
try {
Assert.assertSame(clazz, buf.getClass());
assertSame(clazz, buf.getClass());
} finally {
buf.release();
}