diff --git a/handler/src/test/java/io/netty/handler/ssl/OpenSslEngineTest.java b/handler/src/test/java/io/netty/handler/ssl/OpenSslEngineTest.java index 22c952b8a72..20a0345930d 100644 --- a/handler/src/test/java/io/netty/handler/ssl/OpenSslEngineTest.java +++ b/handler/src/test/java/io/netty/handler/ssl/OpenSslEngineTest.java @@ -36,6 +36,7 @@ import javax.crypto.spec.SecretKeySpec; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngineResult; +import javax.net.ssl.SSLEngineResult.HandshakeStatus; import javax.net.ssl.SSLException; import javax.net.ssl.SSLParameters; import java.nio.ByteBuffer; @@ -62,6 +63,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; @@ -1130,6 +1132,19 @@ public boolean permits( } } + private static void runTasksIfNeeded(SSLEngine engine) { + if (engine.getHandshakeStatus() == HandshakeStatus.NEED_TASK) { + for (;;) { + Runnable task = engine.getDelegatedTask(); + if (task == null) { + assertNotEquals(HandshakeStatus.NEED_TASK, engine.getHandshakeStatus()); + break; + } + task.run(); + } + } + } + @Test public void testExtractMasterkeyWorksCorrectly() throws Exception { SelfSignedCertificate cert = new SelfSignedCertificate(); @@ -1198,17 +1213,23 @@ public void testExtractMasterkeyWorksCorrectly() throws Exception { cTOs.flip(); sTOc.flip(); + runTasksIfNeeded(clientEngine); + runTasksIfNeeded(serverEngine); + clientEngine.unwrap(sTOc, clientIn); serverEngine.unwrap(cTOs, serverIn); + runTasksIfNeeded(clientEngine); + runTasksIfNeeded(serverEngine); + // check when the application data has fully been consumed and sent // for both the client and server if ((clientOut.limit() == serverIn.position()) && (serverOut.limit() == clientIn.position())) { - byte[] serverRandom = SSL.getServerRandom(((OpenSslEngine) serverEngine).sslPointer()); - byte[] clientRandom = SSL.getClientRandom(((OpenSslEngine) clientEngine).sslPointer()); - byte[] serverMasterKey = SSL.getMasterKey(((OpenSslEngine) serverEngine).sslPointer()); - byte[] clientMasterKey = SSL.getMasterKey(((OpenSslEngine) clientEngine).sslPointer()); + byte[] serverRandom = SSL.getServerRandom(unwrapEngine(serverEngine).sslPointer()); + byte[] clientRandom = SSL.getClientRandom(unwrapEngine(clientEngine).sslPointer()); + byte[] serverMasterKey = SSL.getMasterKey(unwrapEngine(serverEngine).sslPointer()); + byte[] clientMasterKey = SSL.getMasterKey(unwrapEngine(clientEngine).sslPointer()); asserted = true; assertArrayEquals(serverMasterKey, clientMasterKey); @@ -1314,7 +1335,9 @@ ReferenceCountedOpenSslEngine unwrapEngine(SSLEngine engine) { @Override protected SslContext wrapContext(SslContext context) { - ((OpenSslContext) context).setUseTasks(useTasks); + if (context instanceof OpenSslContext) { + ((OpenSslContext) context).setUseTasks(useTasks); + } return context; } } diff --git a/handler/src/test/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngineTest.java b/handler/src/test/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngineTest.java index a3effd88f5a..9137dc3d984 100644 --- a/handler/src/test/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngineTest.java +++ b/handler/src/test/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngineTest.java @@ -72,7 +72,9 @@ public void testNotLeakOnException() throws Exception { @Override protected SslContext wrapContext(SslContext context) { - ((ReferenceCountedOpenSslContext) context).setUseTasks(useTasks); + if (context instanceof ReferenceCountedOpenSslContext) { + ((ReferenceCountedOpenSslContext) context).setUseTasks(useTasks); + } return context; } }