Author: musachy
Date: Fri Aug  7 23:22:12 2009
New Revision: 802265

URL: http://svn.apache.org/viewvc?rev=802265&view=rev
Log:
add test for concurrent access to the cache

Modified:
    
struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
    
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/jstl.jsp

Modified: 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java?rev=802265&r1=802264&r2=802265&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
 (original)
+++ 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
 Fri Aug  7 23:22:12 2009
@@ -36,6 +36,11 @@
 import javax.servlet.Servlet;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.BrokenBarrierException;
 
 public class EmbeddedJSPResultTest extends TestCase {
     private HttpServletRequest request;
@@ -96,14 +101,14 @@
     }
 
     public void testJSTL() throws Exception {
-           result.setLocation("org/apache/struts2/jstl.jsp");
-           result.execute(null);
+        result.setLocation("org/apache/struts2/jstl.jsp");
+        result.execute(null);
 
-           assertEquals("XXXXXXXXXXX", cleanup(response.getContentAsString()));
-       }
+        assertEquals("XXXXXXXXXXXY", cleanup(response.getContentAsString()));
+    }
 
 
-     public void testCachedInstances() throws InterruptedException {
+    public void testCachedInstances() throws InterruptedException {
         ServletCache cache = new ServletCache();
         Servlet servlet1 = cache.get("org/apache/struts2/simple0.jsp");
         Servlet servlet2 = cache.get("org/apache/struts2/simple0.jsp");
@@ -111,6 +116,37 @@
         assertSame(servlet1, servlet2);
     }
 
+    public void testCacheInstanceWithManyThreads() throws 
BrokenBarrierException, InterruptedException {
+        //start a bunch of thread at the same time using CyclicBarrier and hit 
the cache
+        //then wait for all the threads to end and check that they all got a 
reference to the same object
+        //and the cache size should be 1
+
+        DummyServletCache cache = new DummyServletCache();
+        int numThreads = 70;
+
+        CyclicBarrier startBarrier = new CyclicBarrier(numThreads + 1);
+        CyclicBarrier endBarrier = new CyclicBarrier(numThreads + 1);
+
+        List<ServletGetRunnable> runnables = new 
ArrayList<ServletGetRunnable>(numThreads);
+
+        //create the threads
+        for (int i = 0; i < numThreads; i++) {
+            ServletGetRunnable runnable = new ServletGetRunnable(cache, 
startBarrier, endBarrier, ActionContext.getContext());
+            Thread thread = new Thread(runnable);
+            runnables.add(runnable);
+            thread.start();
+        }
+
+        startBarrier.await();
+        endBarrier.await();
+        Object servlet = cache.get("org/apache/struts2/simple0.jsp");
+        assertEquals(1, cache.size());
+
+        for (ServletGetRunnable runnable : runnables) {
+            assertSame(servlet, runnable.getObject());
+        }
+    }
+
     private String cleanup(String str) {
         return str.replaceAll("\\s", "");
     }
@@ -178,3 +214,41 @@
 class DummyConverter extends XWorkConverter {
 
 }
+
+class DummyServletCache extends ServletCache {
+    public int size() {
+        return cache.size();
+    }
+}
+
+class ServletGetRunnable implements Runnable {
+    private ServletCache servletCache;
+    private Object object;
+    private CyclicBarrier startBarrier;
+    private ActionContext actionContext;
+    private CyclicBarrier endBarrier;
+
+    ServletGetRunnable(ServletCache servletCache, CyclicBarrier startBarrier, 
CyclicBarrier endBarrier, ActionContext actionContext) {
+        this.servletCache = servletCache;
+        this.startBarrier = startBarrier;
+        this.endBarrier = endBarrier;
+        this.actionContext = actionContext;
+    }
+
+    @Override
+    public void run() {
+        ActionContext.setContext(actionContext);
+        //wait to start all therads at once..or try at least
+        try {
+            startBarrier.await();
+            object = servletCache.get("org/apache/struts2/simple0.jsp");
+            endBarrier.await();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Object getObject() {
+        return object;
+    }
+}

Modified: 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/jstl.jsp
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/jstl.jsp?rev=802265&r1=802264&r2=802265&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/jstl.jsp
 (original)
+++ 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/jstl.jsp
 Fri Aug  7 23:22:12 2009
@@ -3,4 +3,7 @@
 <c:set var="number" value="10"/>
 <c:forEach begin="0" end="${number}">
 X    
-</c:forEach>
\ No newline at end of file
+</c:forEach>
+<c:if test="${number < 15}">
+Y
+</c:if>
\ No newline at end of file


Reply via email to