/* DigiDoc4J library * * This software is released under either the GNU Library General Public * License (see LICENSE.LGPL). * * Note that the only valid version of the LGPL license as far as this * project is concerned is the original GNU Library General Public License * Version 2.1, February 1999 */ package org.digidoc4j.impl.bdoc.xades.validation; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.digidoc4j.Configuration; import org.digidoc4j.Container; import org.digidoc4j.ContainerBuilder; import org.digidoc4j.ValidationResult; import org.junit.Before; import org.junit.Test; public class ThreadPoolManagerTest { private Configuration configuration; private ThreadPoolManager manager; @Before public void setUp() throws Exception { configuration = new Configuration(Configuration.Mode.TEST); manager = new ThreadPoolManager(configuration); } @Test public void getDefaultThreadExecutor() throws Exception { assertNotNull(manager.getThreadExecutor()); } @Test public void setDefaultThreadExecutor() throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); ThreadPoolManager.setDefaultThreadExecutor(executor); assertSame(executor, manager.getThreadExecutor()); } @Test public void setThreadExecutorInConfiguration() throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); configuration.setThreadExecutor(executor); assertSame(executor, manager.getThreadExecutor()); } @Test public void submitTaskToThreadExecutorSetInConfiguration() throws Exception { ExecutorServiceSpy executor = new ExecutorServiceSpy(); configuration.setThreadExecutor(executor); DummyTask task = new DummyTask(); manager.submit(task); assertSame(task, executor.getSubmittedTasks().get(0)); } @Test public void validateContainerWithCustomThreadExecutor() throws Exception { ExecutorServiceSpy executor = new ExecutorServiceSpy(); configuration.setThreadExecutor(executor); ValidationResult result = validateContainer("testFiles/two_signatures.bdoc", configuration); assertFalse(result.isValid()); assertEquals(2, executor.getSubmittedTasks().size()); //Two signatures must be validated within a thread pool } private ValidationResult validateContainer(String containerPath, Configuration configuration) { Container container = openContainerBuilder(containerPath). withConfiguration(configuration). build(); return container.validate(); } private ContainerBuilder openContainerBuilder(String containerPath) { return ContainerBuilder. aContainer("BDOC"). fromExistingFile(containerPath); } private static class ExecutorServiceSpy extends ThreadPoolExecutor { List<Callable> submittedTasks = new ArrayList<>(); public ExecutorServiceSpy() { super(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue(10)); } @Override public <T> Future<T> submit(Callable<T> task) { submittedTasks.add(task); return super.submit(task); } public List<Callable> getSubmittedTasks() { return submittedTasks; } } private class DummyTask implements Callable<Object> { @Override public Object call() throws Exception { return null; } } }