package eu.europa.esig.dss.xades.validation;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.junit.Test;
import eu.europa.esig.dss.DSSDocument;
import eu.europa.esig.dss.FileDocument;
import eu.europa.esig.dss.client.http.DataLoader;
import eu.europa.esig.dss.client.http.NativeHTTPDataLoader;
import eu.europa.esig.dss.validation.CommonCertificateVerifier;
import eu.europa.esig.dss.validation.SignedDocumentValidator;
/**
* Test DSS with multi threads
*
*/
public class ConcurrentValidationTest {
@Test
public void test() throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newFixedThreadPool(20);
CommonCertificateVerifier certificateVerifier = new CommonCertificateVerifier();
DataLoader dataLoader = new NativeHTTPDataLoader();
certificateVerifier.setDataLoader(dataLoader);
List<Future<Boolean>> futures = new ArrayList<Future<Boolean>>();
for (int i = 0; i < 200; i++) {
futures.add(executor.submit(new TestConcurrent(certificateVerifier)));
}
for (Future<Boolean> future : futures) {
assertTrue(future.get());
}
executor.shutdown();
}
class TestConcurrent implements Callable<Boolean> {
private final CommonCertificateVerifier certificateVerifier;
public TestConcurrent(CommonCertificateVerifier certificateVerifier) {
this.certificateVerifier = certificateVerifier;
}
@Override
public Boolean call() throws Exception {
DSSDocument doc = new FileDocument("src/test/resources/dss-817-test.xml");
SignedDocumentValidator validator = SignedDocumentValidator.fromDocument(doc);
validator.setCertificateVerifier(certificateVerifier);
return new Boolean(validator.validateDocument() != null);
}
}
}