improved continuation tests

git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@266 7e9141cc-0065-0410-87d8-b60c137991c4
This commit is contained in:
Greg Wilkins 2009-05-23 14:26:37 +00:00
parent 8f04010f67
commit 2b6057b3ea
9 changed files with 205 additions and 324 deletions

View File

@ -13,8 +13,6 @@
package org.eclipse.jetty.continuation;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.Servlet;

View File

@ -40,13 +40,15 @@ public class ContinuationFilter implements Filter
_debug=param!=null&&Boolean.parseBoolean(param);
param=filterConfig.getInitParameter("partial");
_partial=param!=null&&Boolean.parseBoolean(param) || ContinuationSupport.__jetty6;
_partial=param!=null&&Boolean.parseBoolean(param) || (ContinuationSupport.__jetty6&&!jetty);
param=filterConfig.getInitParameter("faux");
_faux=(param!=null&&Boolean.parseBoolean(param)) || !(jetty || _partial || ContinuationSupport.__servlet3);
if (_debug)
_context.log("ContinuationFilter partial="+_partial+
_context.log("ContinuationFilter "+
" jetty="+jetty+
" partial="+_partial+
" jetty6="+ContinuationSupport.__jetty6+
" faux="+_faux+
" servlet3="+ContinuationSupport.__servlet3);

View File

@ -1,7 +1,6 @@
package org.eclipse.jetty.continuation;
import java.io.IOException;
import java.util.EventListener;

View File

@ -7,8 +7,6 @@ import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.DispatcherType;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.ServletResponse;

View File

@ -19,7 +19,7 @@
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-continuation</artifactId>
<artifactId>jetty-servlet</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
@ -29,6 +29,12 @@
<version>6.1.18</version>
<type>jar</type>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>servlet-api-2.5</artifactId>
<groupId>org.mortbay.jetty</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

View File

@ -1,5 +1,17 @@
package org.eclipse.jetty.servlet;
// ========================================================================
// Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
package org.eclipse.jetty.continuation;
import java.io.IOException;
import java.io.InputStream;
@ -12,63 +24,16 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.continuation.Continuation;
import org.eclipse.jetty.continuation.ContinuationFilter;
import org.eclipse.jetty.continuation.ContinuationListener;
import org.eclipse.jetty.continuation.ContinuationSupport;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.util.IO;
import junit.framework.TestCase;
public class ContinuationTest extends TestCase
public abstract class ContinuationBase extends TestCase
{
protected Server _server = new Server();
protected ServletHandler _servletHandler;
protected SuspendServlet _servlet;
protected SelectChannelConnector _connector;
FilterHolder _filter;
protected void setUp() throws Exception
{
_connector = new SelectChannelConnector();
_server.setConnectors(new Connector[]{ _connector });
ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.NO_SECURITY|ServletContextHandler.NO_SESSIONS);
_server.setHandler(servletContext);
_servletHandler=servletContext.getServletHandler();
_servlet=new SuspendServlet();
ServletHolder holder=new ServletHolder(_servlet);
_servletHandler.addServletWithMapping(holder,"/");
_filter=_servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",0);
}
protected void tearDown() throws Exception
{
_server.stop();
}
public void testNotFaux() throws Exception
{
_filter.setInitParameter("debug","true");
_filter.setInitParameter("faux","true");
_server.start();
doit("AsyncRequest");
}
public void testNotJetty6() throws Exception
{
_filter.setInitParameter("debug","true");
_filter.setInitParameter("faux","false");
_server.start();
doit("AsyncRequest");
}
protected SuspendServlet _servlet=new SuspendServlet();
protected int _port;
private void doit(String type) throws Exception
protected void doit(String type) throws Exception
{
String response;
@ -142,13 +107,17 @@ public class ContinuationTest extends TestCase
request+="Content-Length: "+content.length()+"\r\n";
request+="\r\n" + content;
Socket socket = new Socket("localhost",_connector.getLocalPort());
Socket socket = new Socket("localhost",_port);
socket.getOutputStream().write(request.getBytes("UTF-8"));
String response = IO.toString(socket.getInputStream());
String response = toString(socket.getInputStream());
return response;
}
protected abstract String toString(InputStream in) throws IOException;
private static class SuspendServlet extends HttpServlet
{
private Timer _timer=new Timer();
@ -169,8 +138,6 @@ public class ContinuationTest extends TestCase
long resume_after=-1;
long complete_after=-1;
final String uri=request.getRequestURI();
if (request.getParameter("read")!=null)
read_before=Integer.parseInt(request.getParameter("read"));
if (request.getParameter("sleep")!=null)
@ -289,7 +256,9 @@ public class ContinuationTest extends TestCase
}
}
private static ContinuationListener __listener = new ContinuationListener()
private static ContinuationListener __listener =
new ContinuationListener()
{
public void onComplete(Continuation continuation)
{
@ -301,5 +270,6 @@ public class ContinuationTest extends TestCase
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","onTimeout");
continuation.resume();
}
};
}

View File

@ -15,32 +15,22 @@ package org.eclipse.jetty.continuation;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import junit.framework.TestCase;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.FilterHolder;
import org.mortbay.jetty.servlet.ServletHandler;
import org.mortbay.jetty.servlet.ServletHolder;
import org.mortbay.util.IO;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.IO;
public class ContinuationTest extends TestCase
public class ContinuationTest extends ContinuationBase
{
protected Server _server = new Server();
protected ServletHandler _servletHandler;
protected SuspendServlet _servlet;
protected SelectChannelConnector _connector;
FilterHolder _filter;
@ -48,273 +38,52 @@ public class ContinuationTest extends TestCase
{
_connector = new SelectChannelConnector();
_server.setConnectors(new Connector[]{ _connector });
Context servletContext = new Context(Context.NO_SECURITY|Context.NO_SESSIONS);
ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.NO_SECURITY|ServletContextHandler.NO_SESSIONS);
_server.setHandler(servletContext);
_servletHandler=servletContext.getServletHandler();
_servlet=new SuspendServlet();
ServletHolder holder=new ServletHolder(_servlet);
_servletHandler.addServletWithMapping(holder,"/");
_filter=_servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",0);
}
protected void tearDown() throws Exception
{
_server.stop();
}
public void testFaux() throws Exception
public void testNotFaux() throws Exception
{
_filter=_servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",0);
_filter.setInitParameter("debug","true");
_filter.setInitParameter("faux","true");
_server.start();
_port=_connector.getLocalPort();
doit("FauxContinuation");
doit("AsyncRequest");
}
public void testJetty6() throws Exception
public void testNotJetty6() throws Exception
{
_filter=_servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",0);
_filter.setInitParameter("debug","true");
_filter.setInitParameter("faux","false");
_server.start();
_port=_connector.getLocalPort();
doit("Jetty6Continuation");
}
private void doit(String type) throws Exception
{
String response;
response=process(null,null);
assertContains(type,response);
assertContains("NORMAL",response);
assertNotContains("history: onTimeout",response);
assertNotContains("history: onComplete",response);
response=process("sleep=200",null);
assertContains("SLEPT",response);
assertNotContains("history: onTimeout",response);
assertNotContains("history: onComplete",response);
response=process("suspend=200",null);
assertContains("TIMEOUT",response);
assertContains("history: onTimeout",response);
assertContains("history: onComplete",response);
response=process("suspend=200&resume=100",null);
assertContains("RESUMED",response);
assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response);
response=process("suspend=200&resume=0",null);
assertContains("RESUMED",response);
assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response);
response=process("suspend=200&complete=100",null);
assertContains("COMPLETED",response);
assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response);
response=process("suspend=200&complete=0",null);
assertContains("COMPLETED",response);
assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response);
doit("AsyncRequest");
}
protected void assertContains(String content,String response)
public void testNoFilter() throws Exception
{
assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
if (response.indexOf(content,15)<0)
{
System.err.println(content+" NOT IN '"+response+"'");
assertTrue(false);
}
_server.start();
_port=_connector.getLocalPort();
doit("AsyncRequest");
}
protected void assertNotContains(String content,String response)
protected String toString(InputStream in) throws IOException
{
assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
if (response.indexOf(content,15)>=0)
{
System.err.println(content+" IS IN '"+response+"'");
assertTrue(false);
}
return IO.toString(in);
}
public synchronized String process(String query,String content) throws Exception
{
String request = "GET /";
if (query!=null)
request+="?"+query;
request+=" HTTP/1.1\r\n"+
"Host: localhost\r\n"+
"Connection: close\r\n";
if (content!=null)
request+="Content-Length: "+content.length()+"\r\n";
request+="\r\n" + content;
Socket socket = new Socket("localhost",_connector.getLocalPort());
socket.getOutputStream().write(request.getBytes("UTF-8"));
String response = IO.toString(socket.getInputStream());
return response;
}
private static class SuspendServlet extends HttpServlet
{
private Timer _timer=new Timer();
public SuspendServlet()
{}
/* ------------------------------------------------------------ */
protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
{
final Continuation continuation = ContinuationSupport.getContinuation(request,response);
response.addHeader("history",continuation.getClass().toString());
int read_before=0;
long sleep_for=-1;
long suspend_for=-1;
long resume_after=-1;
long complete_after=-1;
final String uri=request.getRequestURI();
if (request.getParameter("read")!=null)
read_before=Integer.parseInt(request.getParameter("read"));
if (request.getParameter("sleep")!=null)
sleep_for=Integer.parseInt(request.getParameter("sleep"));
if (request.getParameter("suspend")!=null)
suspend_for=Integer.parseInt(request.getParameter("suspend"));
if (request.getParameter("resume")!=null)
resume_after=Integer.parseInt(request.getParameter("resume"));
if (request.getParameter("complete")!=null)
complete_after=Integer.parseInt(request.getParameter("complete"));
if (continuation.isInitial())
{
if (read_before>0)
{
byte[] buf=new byte[read_before];
request.getInputStream().read(buf);
}
else if (read_before<0)
{
InputStream in = request.getInputStream();
int b=in.read();
while(b!=-1)
b=in.read();
}
if (suspend_for>=0)
{
if (suspend_for>0)
continuation.setTimeout(suspend_for);
continuation.addContinuationListener(__listener);
continuation.suspend();
if (complete_after>0)
{
TimerTask complete = new TimerTask()
{
public void run()
{
try
{
response.setStatus(200);
response.getOutputStream().println("COMPLETED\n");
continuation.complete();
}
catch(Exception e)
{
e.printStackTrace();
}
}
};
synchronized (_timer)
{
_timer.schedule(complete,complete_after);
}
}
else if (complete_after==0)
{
response.setStatus(200);
response.getOutputStream().println("COMPLETED\n");
continuation.complete();
}
else if (resume_after>0)
{
TimerTask resume = new TimerTask()
{
public void run()
{
continuation.resume();
}
};
synchronized (_timer)
{
_timer.schedule(resume,resume_after);
}
}
else if (resume_after==0)
{
continuation.resume();
}
}
else if (sleep_for>=0)
{
try
{
Thread.sleep(sleep_for);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
response.setStatus(200);
response.getOutputStream().println("SLEPT\n");
}
else
{
response.setStatus(200);
response.getOutputStream().println("NORMAL\n");
}
}
else if (continuation.isExpired())
{
response.setStatus(200);
response.getOutputStream().println("TIMEOUT\n");
}
else if (continuation.isResumed())
{
response.setStatus(200);
response.getOutputStream().println("RESUMED\n");
}
else
{
response.setStatus(200);
response.getOutputStream().println("unknown???\n");
}
}
}
private static ContinuationListener __listener =
new ContinuationListener()
{
public void onComplete(Continuation continuation)
{
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","onComplete");
}
public void onTimeout(Continuation continuation)
{
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","onTimeout");
continuation.resume();
}
};
}

View File

@ -0,0 +1,70 @@
// ========================================================================
// Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
package org.eclipse.jetty.continuation;
import java.io.IOException;
import java.io.InputStream;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.FilterHolder;
import org.mortbay.jetty.servlet.ServletHandler;
import org.mortbay.jetty.servlet.ServletHolder;
import org.mortbay.util.IO;
public class FauxContinuationTest extends ContinuationBase
{
protected Server _server = new Server();
protected ServletHandler _servletHandler;
protected SelectChannelConnector _connector;
FilterHolder _filter;
protected void setUp() throws Exception
{
_connector = new SelectChannelConnector();
_server.setConnectors(new Connector[]{ _connector });
Context servletContext = new Context(Context.NO_SECURITY|Context.NO_SESSIONS);
_server.setHandler(servletContext);
_servletHandler=servletContext.getServletHandler();
ServletHolder holder=new ServletHolder(_servlet);
_servletHandler.addServletWithMapping(holder,"/");
_filter=_servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",0);
}
protected void tearDown() throws Exception
{
_server.stop();
}
public void testFaux() throws Exception
{
_filter.setInitParameter("debug","true");
_filter.setInitParameter("faux","true");
_server.start();
_port=_connector.getLocalPort();
doit("FauxContinuation");
}
protected String toString(InputStream in) throws IOException
{
return IO.toString(in);
}
}

View File

@ -0,0 +1,69 @@
// ========================================================================
// Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
package org.eclipse.jetty.continuation;
import java.io.IOException;
import java.io.InputStream;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.FilterHolder;
import org.mortbay.jetty.servlet.ServletHandler;
import org.mortbay.jetty.servlet.ServletHolder;
import org.mortbay.util.IO;
public class Jetty6ContinuationTest extends ContinuationBase
{
protected Server _server = new Server();
protected ServletHandler _servletHandler;
protected SelectChannelConnector _connector;
FilterHolder _filter;
protected void setUp() throws Exception
{
_connector = new SelectChannelConnector();
_server.setConnectors(new Connector[]{ _connector });
Context servletContext = new Context(Context.NO_SECURITY|Context.NO_SESSIONS);
_server.setHandler(servletContext);
_servletHandler=servletContext.getServletHandler();
ServletHolder holder=new ServletHolder(_servlet);
_servletHandler.addServletWithMapping(holder,"/");
_filter=_servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",0);
}
protected void tearDown() throws Exception
{
_server.stop();
}
public void testJetty6() throws Exception
{
_filter.setInitParameter("debug","true");
_filter.setInitParameter("faux","false");
_server.start();
_port=_connector.getLocalPort();
doit("Jetty6Continuation");
}
protected String toString(InputStream in) throws IOException
{
return IO.toString(in);
}
}