Unit Test for SslHandler's handlerRemoved()
Motivation SslHandler's handlerRemoved() is supposed to release the SSLEngine (which it does) but there is no Test for it to make sure it really happens and doesn't unexpectedly change in the future. Modifications Add a Unit Test that makes sure that SslHandler releases the SSLEngine when the Channel gets closed. Result Assurance that SslHandler will not leak (ReferenceCounted) SSLEngines.
This commit is contained in:
parent
a01519e4f8
commit
3a6157e2aa
@ -16,22 +16,32 @@
|
|||||||
|
|
||||||
package io.netty.handler.ssl;
|
package io.netty.handler.ssl;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.instanceOf;
|
||||||
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
|
import static org.hamcrest.CoreMatchers.nullValue;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
import static org.junit.Assume.assumeTrue;
|
||||||
|
|
||||||
|
import javax.net.ssl.SSLContext;
|
||||||
|
import javax.net.ssl.SSLEngine;
|
||||||
|
import javax.net.ssl.SSLProtocolException;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBufAllocator;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import io.netty.channel.ChannelHandler;
|
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||||
import io.netty.channel.ChannelOutboundHandlerAdapter;
|
import io.netty.channel.ChannelOutboundHandlerAdapter;
|
||||||
import io.netty.channel.embedded.EmbeddedChannel;
|
import io.netty.channel.embedded.EmbeddedChannel;
|
||||||
import io.netty.handler.codec.DecoderException;
|
import io.netty.handler.codec.DecoderException;
|
||||||
import io.netty.handler.codec.UnsupportedMessageTypeException;
|
import io.netty.handler.codec.UnsupportedMessageTypeException;
|
||||||
import org.junit.Test;
|
import io.netty.handler.ssl.util.SelfSignedCertificate;
|
||||||
|
import io.netty.util.ReferenceCountUtil;
|
||||||
import javax.net.ssl.SSLContext;
|
import io.netty.util.ReferenceCounted;
|
||||||
import javax.net.ssl.SSLEngine;
|
|
||||||
import javax.net.ssl.SSLProtocolException;
|
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.*;
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
public class SslHandlerTest {
|
public class SslHandlerTest {
|
||||||
|
|
||||||
@ -68,6 +78,34 @@ public class SslHandlerTest {
|
|||||||
ch.writeOutbound(new Object());
|
ch.writeOutbound(new Object());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testReleaseSslEngine() throws Exception {
|
||||||
|
assumeTrue(OpenSsl.isAvailable());
|
||||||
|
|
||||||
|
SelfSignedCertificate cert = new SelfSignedCertificate();
|
||||||
|
try {
|
||||||
|
SslContext sslContext = SslContextBuilder.forServer(cert.certificate(), cert.privateKey())
|
||||||
|
.sslProvider(SslProvider.OPENSSL)
|
||||||
|
.build();
|
||||||
|
try {
|
||||||
|
SSLEngine sslEngine = sslContext.newEngine(ByteBufAllocator.DEFAULT);
|
||||||
|
EmbeddedChannel ch = new EmbeddedChannel(new SslHandler(sslEngine));
|
||||||
|
|
||||||
|
assertEquals(1, ((ReferenceCounted) sslContext).refCnt());
|
||||||
|
assertEquals(1, ((ReferenceCounted) sslEngine).refCnt());
|
||||||
|
|
||||||
|
ch.close().syncUninterruptibly();
|
||||||
|
|
||||||
|
assertEquals(1, ((ReferenceCounted) sslContext).refCnt());
|
||||||
|
assertEquals(0, ((ReferenceCounted) sslEngine).refCnt());
|
||||||
|
} finally {
|
||||||
|
ReferenceCountUtil.release(sslContext);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
cert.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static final class TlsReadTest extends ChannelOutboundHandlerAdapter {
|
private static final class TlsReadTest extends ChannelOutboundHandlerAdapter {
|
||||||
private volatile boolean readIssued;
|
private volatile boolean readIssued;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user