/* * Carrot2 project. * * Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński. * All rights reserved. * * Refer to the full license file "carrot2.LICENSE" * in the root folder of the repository checkout or at: * http://www.carrot2.org/carrot2.LICENSE */ package org.carrot2.core; import org.carrot2.core.ControllerTestsBase.ComponentWithInitParameter; import org.carrot2.util.attribute.Bindable; import org.carrot2.util.tests.CarrotTestCase; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Suite; import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering; import org.carrot2.shaded.guava.common.collect.ImmutableMap; /** * Runs matrix tests on {@link Controller} in all realistic configurations. */ @RunWith(Suite.class) @Suite.SuiteClasses( { ControllerTest.ComponentManagerIndependentTests.class, ControllerTest.SimpleControllerCommonTests.class, ControllerTest.PoolingControllerCommonTests.class, ControllerTest.PoolingControllerPoolingTests.class, ControllerTest.CachingPoolingControllerCachingOffCommonTests.class, ControllerTest.CachingPoolingControllerCachingOffPoolingTests.class, ControllerTest.CachingPoolingControllerCachingOnCommonTests.class, ControllerTest.CachingPoolingControllerCachingOnPoolingTests.class, ControllerTest.CachingPoolingControllerCachingOnCachingTests.class, ControllerTest.CachingControllerCachingOffCommonTests.class, ControllerTest.CachingControllerCachingOnCommonTests.class, ControllerTest.CachingControllerCachingOnCachingTests.class }) @SuppressWarnings("unchecked") public class ControllerTest { @ThreadLeakLingering(linger = 2000) public static class ComponentManagerIndependentTests extends CarrotTestCase { @Test public void testAutomaticInitialization() { Controller controller = null; try { controller = new Controller(); controller.process(ImmutableMap.<String, Object> of(), ComponentWithInitParameter.class); } finally { controller.close(); } } @Test(expected = IllegalStateException.class) public void testUsingSimpleManagerWithMoreThanOneController() { checkManagerWithMultipleControllers(new SimpleProcessingComponentManager()); } @Test(expected = IllegalStateException.class) public void testUsingPoolingManagerWithMoreThanOneController() { checkManagerWithMultipleControllers(new PoolingProcessingComponentManager()); } @Test(expected = IllegalStateException.class) public void testUsingCachingManagerWithMoreThanOneController() { checkManagerWithMultipleControllers(new CachingProcessingComponentManager( new SimpleProcessingComponentManager())); } @Test(expected = IllegalArgumentException.class) public void testUnknownComponentId() { processAndDispose("nonexistent-component"); } @Test(expected = IllegalArgumentException.class) public void testUnexpectedComponentClass() { processAndDispose(Integer.class); } @Test(expected = IllegalArgumentException.class) public void testUnexpectedComponentDesignatorType() { processAndDispose(42); } @Test(expected = IllegalStateException.class) public void testMultipleInitialization() { Controller controller = null; try { controller = new Controller(); controller.init(); controller.init(); } finally { controller.close(); } } @Test public void testMultipleDisposal() { final Controller controller = new Controller(); try { controller.init(); controller.dispose(); controller.dispose(); } finally { controller.close(); } } private void checkManagerWithMultipleControllers( final IProcessingComponentManager manager) { Controller controller1 = null; Controller controller2 = null; try { controller1 = new Controller(manager); controller2 = new Controller(manager); controller1.init(); controller2.init(); } finally { controller1.close(); controller2.close(); } } private void processAndDispose(final Object designator) { Controller controller = null; try { controller = new Controller(); controller.init(); controller.process(ImmutableMap.<String, Object> of(), designator); } finally { controller.close(); } } } public static class SimpleControllerCommonTests extends ControllerTestsCommon { @Override public Controller getSimpleController() { return ControllerFactory.createSimple(); } } @Bindable public static class TestProcessingComponent1 extends ProcessingComponentBase { @Override public void process() throws ProcessingException { try { Thread.sleep(Long.MAX_VALUE); } catch (InterruptedException e) { // fall through. } } } public static class PoolingControllerWithFixedPoolCommonTests extends ControllerTestsCommon { private static final int EAGERLY_INITIALIZED_INSTANCES = 6; @Override public Controller getSimpleController() { return ControllerFactory.createPooling(EAGERLY_INITIALIZED_INSTANCES); } @Override public int eagerlyInitializedInstances() { return EAGERLY_INITIALIZED_INSTANCES; } } public static class PoolingControllerWithFixedPoolPoolingTests extends ControllerTestsPooling { private static final int EAGERLY_INITIALIZED_INSTANCES = 4; @Override public Controller getPoolingController() { return ControllerFactory.createPooling(EAGERLY_INITIALIZED_INSTANCES); } @Override public int eagerlyInitializedInstances() { return EAGERLY_INITIALIZED_INSTANCES; } } public static class PoolingControllerCommonTests extends ControllerTestsCommon { @Override public Controller getSimpleController() { return ControllerFactory.createPooling(); } } public static class PoolingControllerPoolingTests extends ControllerTestsPooling { @Override public Controller getPoolingController() { return ControllerFactory.createPooling(); } } public static class CachingPoolingControllerCachingOffCommonTests extends ControllerTestsCommon { @Override public Controller getSimpleController() { return ControllerFactory.createCachingPooling(); } } public static class CachingPoolingControllerCachingOffPoolingTests extends ControllerTestsPooling { @Override public Controller getPoolingController() { return ControllerFactory.createCachingPooling(); } } public static class CachingPoolingControllerCachingOnCommonTests extends ControllerTestsCommon { @Override public Controller getSimpleController() { return ControllerFactory.createCachingPooling(IProcessingComponent.class); } } public static class CachingPoolingControllerCachingOnPoolingTests extends ControllerTestsPooling { @Override public Controller getPoolingController() { return ControllerFactory.createCachingPooling(IProcessingComponent.class); } } public static class CachingPoolingControllerCachingOnCachingTests extends ControllerTestsCaching { @Override public Controller getCachingController( Class<? extends IProcessingComponent>... cachedComponentClasses) { return ControllerFactory.createCachingPooling(cachedComponentClasses); } } public static class CachingControllerCachingOffCommonTests extends ControllerTestsCommon { @Override public Controller getSimpleController() { return ControllerFactory.createCaching(); } } public static class CachingControllerCachingOnCommonTests extends ControllerTestsCommon { @Override public Controller getSimpleController() { return ControllerFactory.createCaching(IProcessingComponent.class); } } public static class CachingControllerCachingOnCachingTests extends ControllerTestsCaching { @Override public Controller getCachingController( Class<? extends IProcessingComponent>... cachedComponentClasses) { return ControllerFactory.createCaching(cachedComponentClasses); } } }