[jboss-cvs] JBossAS SVN: r62628 - in branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web: stress and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Sun Apr 29 23:18:27 EDT 2007
Author: bstansberry at jboss.com
Date: 2007-04-29 23:18:27 -0400 (Sun, 29 Apr 2007)
New Revision: 62628
Added:
branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/
branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/test/
branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/test/SyncReplStressUnitTestCase.java
branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/web/
branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/web/StressTestServlet.java
Log:
[ASPATCH-208] Test for background thread overwriting sessions
Added: branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/test/SyncReplStressUnitTestCase.java
===================================================================
--- branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/test/SyncReplStressUnitTestCase.java (rev 0)
+++ branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/test/SyncReplStressUnitTestCase.java 2007-04-30 03:18:27 UTC (rev 62628)
@@ -0,0 +1,146 @@
+package org.jboss.test.cluster.web.stress.test;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import junit.framework.Test;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.jboss.test.JBossClusteredTestCase;
+import org.jboss.test.cluster.test.BaseTest;
+import org.jboss.test.cluster.web.stress.web.StressTestServlet;
+
+public class SyncReplStressUnitTestCase extends BaseTest
+{
+ private static final String SERVLET_URL = "/http-sync-stress/StressTestServlet";
+ private static final String BYTE_SIZE = "50000";
+ private static final int THREAD_COUNT = Integer.parseInt(System.getProperty("jbosstest.cluster.syncstress.threadcount", "25"));
+ private static final int LOOP_COUNT = 30;
+
+ private Map errors = Collections.synchronizedMap(new HashMap());
+ private volatile int threadCount;
+ private volatile int executeCount;
+
+ public SyncReplStressUnitTestCase(String name)
+ {
+ super(name);
+ }
+
+ public static Test suite() throws Exception
+ {
+ Test t1 = JBossClusteredTestCase.getDeploySetup(SyncReplStressUnitTestCase.class,
+ "http-sync-stress.war");
+ return t1;
+ }
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ }
+
+ protected void tearDown() throws Exception
+ {
+ super.tearDown();
+ errors.clear();
+ }
+
+ public void testConcurrentLoad() throws Exception {
+
+ Caller[] threads = new Caller[THREAD_COUNT];
+
+ for (int i=0; i<THREAD_COUNT; i++)
+ {
+ threads[i] = new Caller();
+ threads[i].setDaemon(true);
+ }
+
+ for (int i=0; i<THREAD_COUNT; i++)
+ {
+ threads[i].start();
+ }
+
+ boolean alive = true;
+ while (alive && errors.size() == 0)
+ {
+ alive = false;
+ Thread.sleep(3000);
+ for (int i=0; i<THREAD_COUNT; i++)
+ {
+ if (threads[i].isAlive())
+ {
+ alive = true;
+ break;
+ }
+ }
+ log.info("Completed " + executeCount + " cycles out of " + (THREAD_COUNT * LOOP_COUNT));
+ }
+
+ StringBuffer buf = new StringBuffer();
+ for (Iterator iter = errors.entrySet().iterator(); iter.hasNext(); )
+ {
+ Entry entry = (Entry) iter.next();
+ buf.append("Key:").append(entry.getKey()).append(" \tValue:").append(entry.getValue()).append("\n");
+ }
+ System.out.println(buf.toString());
+ System.out.println("error count : " + errors.size());
+ assertEquals("No errors reported", 0, errors.size());
+ }
+
+ private void execute(HttpClient client) throws Exception
+ {
+ int idx = threadCount++;
+ int node = idx % 2;
+ String[] httpURLs = getHttpURLs();
+ PostMethod method = new PostMethod(httpURLs[node] + SERVLET_URL);
+ method.setParameter(StressTestServlet.BYTES, BYTE_SIZE);
+ int status = client.executeMethod(method);
+ assertEquals(200, status);
+ method.getResponseBody();
+ method.releaseConnection();
+
+ for (int i=0; i < LOOP_COUNT; i++)
+ {
+ sleepThread(1000);
+ node = node++ %2;
+ setCookieDomainToThisServer(client, servers_[node]);
+ method = new PostMethod(httpURLs[node] + SERVLET_URL);
+ method.setParameter(StressTestServlet.CMD, StressTestServlet.SUBTRACT);
+ method.setParameter(StressTestServlet.BYTES, BYTE_SIZE);
+ status = client.executeMethod(method);
+ method.releaseConnection();
+ assertEquals(200, status);
+
+ sleepThread(1000);
+ node = node++ %2;
+ setCookieDomainToThisServer(client, servers_[node]);
+ method = new PostMethod(httpURLs[node] + SERVLET_URL);
+ method.setParameter(StressTestServlet.CMD, StressTestServlet.ADD);
+ method.setParameter(StressTestServlet.BYTES, BYTE_SIZE);
+ status = client.executeMethod(method);
+ method.releaseConnection();
+ assertEquals(200, status);
+
+ executeCount++;
+ }
+ }
+
+ private class Caller extends Thread
+ {
+ public void run()
+ {
+ HttpClient client = new HttpClient();
+ try
+ {
+ execute(client);
+ }
+ catch (Throwable t)
+ {
+ errors.put(getName(), t.getLocalizedMessage());
+ }
+ }
+ }
+}
Added: branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/web/StressTestServlet.java
===================================================================
--- branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/web/StressTestServlet.java (rev 0)
+++ branches/JBoss_4_0_3_SP1_CP/testsuite/src/main/org/jboss/test/cluster/web/stress/web/StressTestServlet.java 2007-04-30 03:18:27 UTC (rev 62628)
@@ -0,0 +1,88 @@
+package org.jboss.test.cluster.web.stress.web;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+public class StressTestServlet extends HttpServlet
+{
+ private static final long serialVersionUID = 1L;
+
+ public static final String CMD = "cmd";
+ public static final String ADD = "ADD";
+ public static final String SUBTRACT = "SUBTRACT";
+ public static final String BYTES = "bytes";
+
+ protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
+ {
+ String cmd = req.getParameter(CMD);
+ if (cmd == null || cmd.length() == 0)
+ {
+ handleNew(req);
+ }
+ else if (ADD.equals(cmd))
+ {
+ handleAdd(req);
+ }
+ else if (SUBTRACT.equals(cmd))
+ {
+ handleSubtract(req);
+ }
+
+ PrintWriter writer = res.getWriter();
+ writer.println("OK");
+ writer.close();
+ }
+
+ private void handleNew(HttpServletRequest req)
+ {
+ HttpSession sess = req.getSession(false);
+ if (sess != null)
+ throw new RuntimeException("Session already exists");
+
+ addBytes(req);
+ }
+
+ private void handleAdd(HttpServletRequest req)
+ {
+ HttpSession sess = req.getSession();
+ if (sess == null)
+ throw new RuntimeException("Session already exists");
+
+ if (sess.getAttribute(BYTES) != null)
+ throw new RuntimeException("bytes already stored");
+
+ addBytes(req);
+ }
+
+ private void handleSubtract(HttpServletRequest req)
+ {
+ HttpSession sess = req.getSession();
+ if (sess == null)
+ throw new RuntimeException("Session already exists");
+
+ byte[] bytes = (byte[]) sess.getAttribute(BYTES);
+ if (bytes == null)
+ throw new RuntimeException("bytes not stored");
+
+ int size = Integer.parseInt(req.getParameter(BYTES));
+ if (bytes.length != size)
+ throw new RuntimeException("bytes are incorrect length; should be " + size +
+ " but is " + bytes.length);
+
+ sess.removeAttribute(BYTES);
+ }
+
+ private void addBytes(HttpServletRequest req)
+ {
+ HttpSession sess = req.getSession();
+ int size = Integer.parseInt(req.getParameter(BYTES));
+ sess.setAttribute(BYTES, new byte[size]);
+ }
+
+}
More information about the jboss-cvs-commits
mailing list