Author: reschke Date: Thu Jun 14 13:18:57 2012 New Revision: 1350226 URL: http://svn.apache.org/viewvc?rev=1350226&view=rev Log: JCR-3342: add additional entry collector tests that run concurrently with a few read-only threads (work-in-progress) Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/acl/EntryCollectorTest.java Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/acl/EntryCollectorTest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/acl/EntryCollectorTest.java?rev=1350226&r1=1350225&r2=1350226&view=diff ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/acl/EntryCollectorTest.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/acl/EntryCollectorTest.java Thu Jun 14 13:18:57 2012 @@ -16,19 +16,16 @@ */ package org.apache.jackrabbit.core.security.authorization.acl; -import org.apache.jackrabbit.api.JackrabbitSession; -import org.apache.jackrabbit.api.security.JackrabbitAccessControlList; -import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager; -import org.apache.jackrabbit.api.security.user.Group; -import org.apache.jackrabbit.api.security.user.User; -import org.apache.jackrabbit.api.security.user.UserManager; -import org.apache.jackrabbit.core.security.TestPrincipal; -import org.apache.jackrabbit.test.NotExecutableException; -import org.apache.jackrabbit.test.api.security.AbstractAccessControlTest; +import java.security.Principal; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; import javax.jcr.AccessDeniedException; import javax.jcr.Node; -import javax.jcr.Property; +import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.security.AccessControlEntry; @@ -37,12 +34,16 @@ import javax.jcr.security.AccessControlM import javax.jcr.security.AccessControlPolicy; import javax.jcr.security.AccessControlPolicyIterator; import javax.jcr.security.Privilege; -import java.security.Principal; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; + +import org.apache.jackrabbit.api.JackrabbitSession; +import org.apache.jackrabbit.api.security.JackrabbitAccessControlList; +import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager; +import org.apache.jackrabbit.api.security.user.Group; +import org.apache.jackrabbit.api.security.user.User; +import org.apache.jackrabbit.api.security.user.UserManager; +import org.apache.jackrabbit.core.security.TestPrincipal; +import org.apache.jackrabbit.test.NotExecutableException; +import org.apache.jackrabbit.test.api.security.AbstractAccessControlTest; /** * EntryCollectorTest... @@ -362,6 +363,120 @@ public class EntryCollectorTest extends } finally { superuser2.logout(); } - } + + static interface TestInvokation { + public void runTest() throws Exception; + } + + private void runTestUnderLoad(TestInvokation ti) throws Exception { + + JcrTestThread t[] = new JcrTestThread[4]; + + for (int i = 0; i < t.length; i++) { + t[i] = new JcrTestThread(); + } + + try { + for (int i = 0; i < t.length; i++) { + t[i].start(); + } + ti.runTest(); + } + finally { + for (int i = 0; i < t.length; i++) { + t[i].stopMe(); + t[i].join(); + Throwable th = t[i].getLastExc(); + if (th != null) { + fail("failure in load thread: " + th); + } + } + } + } + + public void testCacheUnderLoad() throws Exception { + runTestUnderLoad(new TestInvokation() { + public void runTest() throws Exception { + testCache(); + } + }); + } + + public void testEntriesAreCachedUnderLoad() throws Exception { + runTestUnderLoad(new TestInvokation() { + public void runTest() throws Exception { + testEntriesAreCached(); + } + }); + } + + public void testPermissionsUnderLoad() throws Exception { + runTestUnderLoad(new TestInvokation() { + public void runTest() throws Exception { + testPermissions(); + } + }); + } + + /** + * Test code that that walks the repository. + */ + private class JcrTestThread extends Thread { + + private boolean stopme = false; + private Throwable lastErr; + + @Override + public void run() { + while (!this.stopme) { + Session session = null; + try { + session = getHelper().getReadOnlySession(); + walk(session.getRootNode()); + } + catch (RepositoryException ex) { + // ignored + } catch (Throwable ex) { + lastErr = ex; + } + finally { + if (session != null) { + session.logout(); + session = null; + } + } + } + } + + public void stopMe() { + this.stopme = true; + } + + public Throwable getLastExc() { + return lastErr; + } + + private void walk(Node node) { + if (stopme) { + return; + } + + try { + if ("/jcr:system".equals(node.getPath())) { + // do not descend into an non-interesting subtree + return; + } + + NodeIterator ni = node.getNodes(); + while (ni.hasNext()) { + walk(ni.nextNode()); + } + } catch (RepositoryException ex) { + // ignore + } catch (Throwable ex) { + lastErr = ex; + } + } + } } \ No newline at end of file