### Eclipse Workspace Patch 1.0 #P oak-core Index: src/test/java/org/apache/jackrabbit/oak/security/authentication/TokenDefaultLoginModuleTest.java =================================================================== --- src/test/java/org/apache/jackrabbit/oak/security/authentication/TokenDefaultLoginModuleTest.java (revision 1585706) +++ src/test/java/org/apache/jackrabbit/oak/security/authentication/TokenDefaultLoginModuleTest.java (working copy) @@ -16,9 +16,18 @@ */ package org.apache.jackrabbit.oak.security.authentication; + import java.security.Principal; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + import javax.jcr.GuestCredentials; import javax.jcr.SimpleCredentials; import javax.security.auth.login.AppConfigurationEntry; @@ -26,6 +35,7 @@ import javax.security.auth.login.LoginException; import com.google.common.collect.ImmutableSet; + import org.apache.jackrabbit.api.security.authentication.token.TokenCredentials; import org.apache.jackrabbit.oak.AbstractSecurityTest; import org.apache.jackrabbit.oak.api.AuthInfo; @@ -58,6 +68,7 @@ */ public class TokenDefaultLoginModuleTest extends AbstractSecurityTest { + @Override protected Configuration getConfiguration() { return new Configuration() { @@ -301,4 +312,66 @@ } } } + + @Test + public void testValidTokenCredentialsWithConflict() throws Exception { + ExecutorService pool = Executors.newFixedThreadPool(10); + List sessions = new ArrayList(); + + try { + TokenConfiguration tc = getSecurityProvider().getConfiguration( + TokenConfiguration.class); + SimpleCredentials sc = (SimpleCredentials) getAdminCredentials(); + + List tokenProviders = new ArrayList(); + + for (int i = 0; i < 10; i++) { + ContentSession session = login(getAdminCredentials()); + Root r = session.getLatestRoot(); + tokenProviders.add(tc.getTokenProvider(r)); + sessions.add(session); + } + + ArrayList list = new ArrayList(); + + for (TokenProvider tokenProvider : tokenProviders) { + list.add(createDataFuture(pool, tokenProvider, sc.getUserID(), + Collections. emptyMap())); + } + + for (DataFuture df : list) { + assertNotNull(df.future.get()); + } + } finally { + for (ContentSession session : sessions) { + if (session != null) { + session.close(); + } + } + + if (pool != null) { + pool.shutdown(); + } + } + } + + private static class DataFuture { + public Future future; + + public DataFuture(Future future) { + super(); + this.future = future; + } + } + + private DataFuture createDataFuture(ExecutorService pool , final TokenProvider tp,final String userId, final Map attributes){ + Future future = pool.submit(new Callable() { + @Override + public TokenInfo call() throws Exception { + return tp.createToken(userId, attributes); + } + }); + return new DataFuture(future); + } + } \ No newline at end of file