package org.picketlink.test.idm.usecases;
import org.junit.Test;
import org.picketlink.idm.IdentityManager;
import org.picketlink.idm.PartitionManager;
import org.picketlink.idm.config.IdentityConfigurationBuilder;
import org.picketlink.idm.credential.Password;
import org.picketlink.idm.credential.UsernamePasswordCredentials;
import org.picketlink.idm.internal.DefaultPartitionManager;
import org.picketlink.idm.model.basic.Realm;
import org.picketlink.idm.model.basic.User;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
* Created with IntelliJ IDEA. User: pedroigor Date: 8/6/13 Time: 7:32 PM To change this template use File | Settings |
* File Templates.
*/
public class ConcurrencyIssueTestCase {
@Test
public void testPreserveState() throws Exception {
IdentityConfigurationBuilder builder = new IdentityConfigurationBuilder();
builder
.named("file-store-preserve-state")
.stores()
.file()
.workingDirectory("/tmp/teste")
.supportAllFeatures();
PartitionManager partitionManager = new DefaultPartitionManager(builder.buildAll());
Realm realmA = new Realm(Realm.DEFAULT_REALM);
partitionManager.add(realmA);
final User userA = new User("admin");
final IdentityManager identityManager = partitionManager.createIdentityManager();
identityManager.add(userA);
Password password = new Password("admin");
identityManager.updateCredential(userA, password);
ExecutorService executor = Executors.newFixedThreadPool(100);
List<FutureTask<Boolean>> tasks = new ArrayList<FutureTask<Boolean>>();
for (int i = 0; i < 1000; i++) {
FutureTask<Boolean> task = new FutureTask<Boolean>(createTask(userA, partitionManager));
tasks.add(task);
executor.execute(task);
}
for (FutureTask<Boolean> task : tasks) {
assertTrue(task.get(1, TimeUnit.SECONDS));
}
}
private Callable<Boolean> createTask(final User userA, final PartitionManager partitionManager) {
return new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
try {
IdentityManager identityManager = partitionManager.createIdentityManager();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(userA.getLoginName(), new Password("admin"));
assertNotNull(identityManager.lookupById(userA.getClass(), userA.getId()));
identityManager.validateCredentials(credentials);
assertEquals(UsernamePasswordCredentials.Status.VALID, credentials.getStatus());
} catch (Exception e) {
return false;
}
return true;
}
};
}
}