seguin 01/05/29 16:05:58 Modified: jk build.properties.sample build.xml jk/src/java/org/apache/ajp/test TestAjp13.java Added: jk/src/java/org/apache/ajp/test TestAll.java Log: the beginnings of some junit testing Revision Changes Path 1.2 +17 -1 jakarta-tomcat-connectors/jk/build.properties.sample Index: build.properties.sample =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/build.properties.sample,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- build.properties.sample 2001/05/29 05:47:29 1.1 +++ build.properties.sample 2001/05/29 23:05:52 1.2 @@ -2,9 +2,25 @@ # sample build.properties for ajp connector. # edit to taste... # -# $Id: build.properties.sample,v 1.1 2001/05/29 05:47:29 seguin Exp $ +# $Id: build.properties.sample,v 1.2 2001/05/29 23:05:52 seguin Exp $ # +# +# tomcat 4 internals +# catalina.jar = ../../jakarta-tomcat-4.0/build/server/lib/catalina.jar + +# +# servlet api 2.3 +# servlet.jar = ../../jakarta-servletapi-4/dist/lib/servlet.jar + +# +# utils. +# tomcat-util.jar = ../util/build/lib/tomcat-util.jar + +# +# junit jar +# +junit.jar=f:/dev/junit/junit.jar 1.6 +40 -1 jakarta-tomcat-connectors/jk/build.xml Index: build.xml =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/build.xml,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- build.xml 2001/05/29 05:47:15 1.5 +++ build.xml 2001/05/29 23:05:53 1.6 @@ -6,6 +6,26 @@ <property name="jk.build" value="${basedir}/build"/> + <!-- Should all tests fail if one does? --> + <property name="test.failonerror" value="true"/> + + <!-- The test runner to execute --> + <property name="test.runner" value="junit.textui.TestRunner"/> + <property name="test.entry" value="org.apache.ajp.test.TestAll"/> + + <path id="test.classpath"> + <pathelement location="${jk.build}/classes"/> + <pathelement location="${tomcat-util.jar}"/> + <pathelement location="${junit.jar}"/> + </path> + + <path id="build-main.classpath"> + <pathelement location="${tomcat-util.jar}"/> + <pathelement location="${catalina.jar}"/> + <pathelement location="${servlet.jar}"/> + <pathelement location="${junit.jar}"/> + </path> + <target name="build-prepare"> <mkdir dir="${jk.build}"/> <mkdir dir="${jk.build}/classes"/> @@ -16,13 +36,13 @@ <javac srcdir="src/java" destdir="${jk.build}/classes" - classpath="${tomcat-util.jar}:${catalina.jar}:${servlet.jar}" deprecation="on" debug="on" optimize="off" verbose="off" excludes="**/CVS/**"> <exclude name="org/apache/ajp/tomcat4/**" if="tomcat4.skip"/> + <classpath refid="build-main.classpath"/> </javac> <!-- Copy static resource files --> @@ -36,6 +56,25 @@ basedir="${jk.build}/classes" /> </target> + + <target name="test" if="test.entry" depends="build-main" + description="Run all unit test cases"> + <!-- + <junit printsummary="yes" fork="on" haltonfailure="yes"> + <formatter type="plain" usefile="false"/> + <test name="${test.entry}"/> + <classpath refid="test.classpath"/> + </junit> + --> + + <java classname="${test.runner}" fork="yes" + failonerror="${test.failonerror}"> + <!--<jvmarg value="${java.protocol.handler.pkgs}"/>--> + <arg value="${test.entry}"/> + <classpath refid="test.classpath"/> + </java> + </target> + <!-- ================ BUILD: Create Jk Javadocs =================== --> <target name="javadoc"> 1.3 +227 -57 jakarta-tomcat-connectors/jk/src/java/org/apache/ajp/test/TestAjp13.java Index: TestAjp13.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/src/java/org/apache/ajp/test/TestAjp13.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- TestAjp13.java 2001/05/17 23:55:33 1.2 +++ TestAjp13.java 2001/05/29 23:05:57 1.3 @@ -7,79 +7,249 @@ import java.net.*; import java.util.*; -public class TestAjp13 { +// junit +import junit.framework.*; - public static void main(String[] args) throws Exception { - ServerSocket server = new ServerSocket(8009); - System.out.println("TestAjp13 running..."); - Socket socket = server.accept(); - Ajp13 ajp13 = new Ajp13(); - MimeHeaders headers = new MimeHeaders(); - AjpRequest request = new AjpRequest(); - ajp13.setSocket(socket); +public class TestAjp13 extends TestCase { + + Ajp13Server server = null; + + public TestAjp13(String name) { + super(name); + } + + public static Test suite() { + return new TestSuite(TestAjp13.class); + } + + protected void my_setUp() { + println("setup..."); + + server = new Ajp13Server(); + server.start(); + } + + protected void my_tearDown() { + println("tear down..."); + + server.shutdown(); + } + + public void test1() throws Exception { + System.out.println("running test1"); + + my_setUp(); + + Socket s = new Socket("localhost", 8009); + + Ajp13Packet p = new Ajp13Packet(Ajp13.MAX_PACKET_SIZE); + p.appendInt(0x1234); + p.appendInt(0); + p.setByteOff(4); + p.appendByte(Ajp13.JK_AJP13_FORWARD_REQUEST); + p.appendByte((byte)2); + p.appendString("http"); + p.appendString("/test_uri"); + p.appendString("remote_addr"); + p.appendString("remote_host"); + p.appendString("server_name"); + p.appendInt(80); + p.appendBool(false); + p.appendInt(3); + p.appendString("my header"); + p.appendString("my header value"); + p.appendInt((0xA0 << 8) + Ajp13.SC_REQ_AUTHORIZATION); + p.appendString("some auth string"); + p.appendInt((0xA0 << 8) + Ajp13.SC_REQ_USER_AGENT); + p.appendString("TestAjp13 User Agent"); + p.appendByte(Ajp13.SC_A_ARE_DONE); + + int len = p.getByteOff() - 4; + p.setByteOff(2); + p.appendInt(len); + + OutputStream os = s.getOutputStream(); + os.write(p.getBuff(), 0, len + 4); + + InputStream is = s.getInputStream(); + + System.out.println("decoding response..."); + + boolean done = false; + while (!done) { + int b1, b2; + // read a packet + + // first 2 bytes should be AB + b1 = is.read(); + assertTrue("byte 1 was " + (char)b1, b1 == (int)'A'); + b2 = is.read(); + assertTrue("byte 2 was " + (char)b2, b2 == (int)'B'); - boolean moreRequests = true; - while (moreRequests) { + System.out.println("b1 = " + (char)b1 + "; b2 = " + (char)b2); - int status = 0; - try { - status = ajp13.receiveNextRequest(request); - } catch (IOException e) { - System.out.println("process: ajp13.receiveNextRequest -> " + e); - } + // next is length + b1 = is.read(); + b1 &= 0xFF; + b2 = is.read(); + b2 &= 0xFF; - if( status==-2) { - // special case - shutdown - // XXX need better communication, refactor it -// if( !doShutdown(socket.getLocalAddress(), -// socket.getInetAddress())) { -// moreRequests = false; -// continue; -// } - break; + int l = (b1 << 8) + b2; + + System.out.println("length = " + l); + + // now get data + byte[] buf = new byte[l]; + int n = 0; + int off = 0; + int total = 0; + while ((n = is.read(buf, off, l - off)) != -1 && (l - off != 0)) { + total += n; + off += n; } + + System.out.println("read " + total); + + assertTrue("total read was " + total + + ", should have been " + l, + total == l); + - if( status != 200 ) + + int code = (int)buf[0]; + + switch (code) { + case 3: + System.out.println("AJP13_SEND_BODY_CHUNK "); + break; + case 4: + System.out.println("AJP13_SEND_HEADERS "); + break; + case 5: + System.out.println("AJP13_END_RESPONSE "); + done = true; + break; + case 6: + System.out.println("AJP13_GET_BODY_CHUNK "); break; + default: + assertTrue("invalid prefix code: " + code, false); + break; + } + } - System.out.println(request); + System.out.println("shutting down socket..."); + s.shutdownOutput(); + s.shutdownInput(); + s.close(); + + System.out.println("shutting down server..."); + my_tearDown(); + } + + protected static void println(String msg) { + System.out.println("[TestAjp13] " + msg); + } - String message = - "<html><body><pre>" + - "hello from ajp13: " + - System.getProperty("line.separator") + - request.toString() + - "</pre></body></html>"; - - headers.addValue("content-type").setString( "text/html"); - headers.addValue("content-length").setInt(message.length()); - headers.addValue("my-header").setString( "my value"); - ajp13.sendHeaders(200, headers); + public static void main(String[] args) throws Exception { + } +} - byte[] b = message.getBytes(); - ajp13.doWrite(b, 0, b.length); - ajp13.finish(); +class Ajp13Server extends Thread { - request.recycle(); - headers.recycle(); - } + boolean shutdown = false; + void shutdown() { + this.shutdown = true; + +// try { + this.interrupt(); +// } catch (InterruptedException e) { +// throw new RuntimeException(e.toString()); +// } + } + + public void run() { try { - ajp13.close(); - } catch (IOException e) { - System.out.println("process: ajp13.close ->" + e); - } - - try { - socket.close(); - } catch (IOException e) { - System.out.println("process: socket.close ->" + e); - } - socket = null; + ServerSocket server = new ServerSocket(8009); + System.out.println("Ajp13Server running..."); + Socket socket = server.accept(); + Ajp13 ajp13 = new Ajp13(); + MimeHeaders headers = new MimeHeaders(); + AjpRequest request = new AjpRequest(); + ajp13.setSocket(socket); + + boolean moreRequests = true; + while (moreRequests && !shutdown) { + + int status = 0; + try { + status = ajp13.receiveNextRequest(request); + } catch (IOException e) { + if (shutdown) { + System.out.println("Ajp13Server told to shutdown"); + break; + } + System.out.println("process: ajp13.receiveNextRequest -> " + e); + } + + if( status==-2) { + // special case - shutdown + // XXX need better communication, refactor it + // if( !doShutdown(socket.getLocalAddress(), + // socket.getInetAddress())) { + // moreRequests = false; + // continue; + // } + break; + } + + if( status != 200 ) + break; - System.out.println("process: done"); + System.out.println(request); + + String message = + "<html><body><pre>" + + "hello from ajp13: " + + System.getProperty("line.separator") + + request.toString() + + "</pre></body></html>"; + + headers.addValue("content-type").setString( "text/html"); + headers.addValue("content-length").setInt(message.length()); + headers.addValue("my-header").setString( "my value"); + ajp13.sendHeaders(200, headers); + + byte[] b = message.getBytes(); + ajp13.doWrite(b, 0, b.length); + + ajp13.finish(); + + request.recycle(); + headers.recycle(); + } + try { + ajp13.close(); + } catch (IOException e) { + System.out.println("process: ajp13.close ->" + e); + } + + try { + socket.close(); + } catch (IOException e) { + System.out.println("process: socket.close ->" + e); + } + socket = null; + + System.out.println("process: done"); + + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e.toString()); + } } } 1.1 jakarta-tomcat-connectors/jk/src/java/org/apache/ajp/test/TestAll.java Index: TestAll.java =================================================================== package org.apache.ajp.test; // junit import junit.framework.*; // ajp import org.apache.ajp.*; public class TestAll extends TestCase { public TestAll(String testName) { super(testName); } public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(TestAjp13.suite()); return suite; } public static void main(String args[]) { String[] testCaseName = { TestAll.class.getName() }; junit.textui.TestRunner.main(testCaseName); } }