Author: markt Date: Tue Apr 22 21:59:26 2014 New Revision: 1589299 URL: http://svn.apache.org/r1589299 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56391 Re-write renegotiation test to test that renegotiation works rather than to test that an exception is not triggered it it is attempted.
Modified: tomcat/trunk/test/org/apache/tomcat/util/net/TestSsl.java Modified: tomcat/trunk/test/org/apache/tomcat/util/net/TestSsl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/net/TestSsl.java?rev=1589299&r1=1589298&r2=1589299&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/tomcat/util/net/TestSsl.java (original) +++ tomcat/trunk/test/org/apache/tomcat/util/net/TestSsl.java Tue Apr 22 21:59:26 2014 @@ -16,7 +16,6 @@ */ package org.apache.tomcat.util.net; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -24,18 +23,21 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; +import javax.net.ssl.HandshakeCompletedEvent; +import javax.net.ssl.HandshakeCompletedListener; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; import org.junit.Assert; import org.junit.Assume; import org.junit.Test; import org.apache.catalina.Context; +import org.apache.catalina.Wrapper; +import org.apache.catalina.startup.TesterServlet; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; import org.apache.tomcat.util.buf.ByteChunk; @@ -98,12 +100,11 @@ public class TestSsl extends TomcatBaseT Assume.assumeTrue("SSL renegotiation has to be supported for this test", TesterSupport.isRenegotiationSupported(getTomcatInstance())); - File appDir = new File(getBuildDirectory(), "webapps/examples"); - // app dir is relative to server home - Context ctxt = tomcat.addWebapp(null, "/examples", - appDir.getAbsolutePath()); - ctxt.addApplicationListener(new ApplicationListener( - WsContextListener.class.getName(), false)); + Context root = tomcat.addContext("", TEMP_DIR); + Wrapper w = + Tomcat.addServlet(root, "tester", new TesterServlet()); + w.setAsyncSupported(true); + root.addServletMapping("/", "tester"); TesterSupport.initSsl(tomcat); @@ -116,33 +117,71 @@ public class TestSsl extends TomcatBaseT getPort()); OutputStream os = socket.getOutputStream(); + InputStream is = socket.getInputStream(); + Reader r = new InputStreamReader(is); - os.write("GET /examples/servlets/servlet/HelloWorldExample HTTP/1.1\n".getBytes()); - os.flush(); + doRequest(os, r); + + TesterHandshakeListener listener = new TesterHandshakeListener(); + socket.addHandshakeCompletedListener(listener); socket.startHandshake(); - try { - os.write("Host: localhost\n\n".getBytes()); - } catch (IOException ex) { - ex.printStackTrace(); - fail("Re-negotiation failed"); + // One request should be sufficient + int requestCount = 0; + while (!listener.isComplete() && requestCount < 5) { + doRequest(os, r); + requestCount++; } - InputStream is = socket.getInputStream(); - Reader r = new InputStreamReader(is); - BufferedReader br = new BufferedReader(r); - String line = br.readLine(); - Assert.assertEquals("HTTP/1.1 200 OK", line); - while (line != null) { - // For debugging System.out.println(line); - // Linux clients see a Connection Reset in some circumstances and a - // clean close in others. - try { - line = br.readLine(); - } catch (IOException ioe) { - line = null; + Assert.assertTrue(listener.isComplete()); + System.out.println("Renegotiation completed after " + requestCount + " requests"); + } + + private void doRequest(OutputStream os, Reader r) throws IOException { + char[] expectedResponseLine = "HTTP/1.1 200 OK\r\n".toCharArray(); + + os.write("GET /tester HTTP/1.1\r\n".getBytes()); + os.write("Host: localhost\r\n".getBytes()); + os.write("Connection: Keep-Alive\r\n\r\n".getBytes()); + os.flush(); + + // First check we get the expected response line + for (char c : expectedResponseLine) { + int read = r.read(); + Assert.assertEquals(c, read); + } + + // Skip to the end of the headers + char[] endOfHeaders ="\r\n\r\n".toCharArray(); + int found = 0; + while (found != endOfHeaders.length) { + if (r.read() == endOfHeaders[found]) { + found++; + } else { + found = 0; } } + + // Read the body + char[] expectedBody = "OK".toCharArray(); + for (char c : expectedBody) { + int read = r.read(); + Assert.assertEquals(c, read); + } + } + + private static class TesterHandshakeListener implements HandshakeCompletedListener { + + private volatile boolean complete = false; + + @Override + public void handshakeCompleted(HandshakeCompletedEvent event) { + complete = true; + } + + public boolean isComplete() { + return complete; + } } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org