package rocks.inspectit.server.diagnosis.engine.session; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.testng.annotations.Test; import rocks.inspectit.server.diagnosis.engine.DiagnosisEngineConfiguration; import rocks.inspectit.server.diagnosis.engine.rule.factory.Rules; import rocks.inspectit.server.diagnosis.engine.rule.store.DefaultRuleOutputStorage; import rocks.inspectit.server.diagnosis.engine.rule.store.IRuleOutputStorage; import rocks.inspectit.server.diagnosis.engine.session.Session.State; import rocks.inspectit.server.diagnosis.engine.testrules.RuleA; import rocks.inspectit.server.diagnosis.engine.testrules.RuleB; import rocks.inspectit.server.diagnosis.engine.testrules.RuleC; import rocks.inspectit.shared.all.testbase.TestBase; /** * Tests the {@link SessionFactoryTest} class. * * @author Alexander Wert * */ public class SessionFactoryTest extends TestBase { SessionFactory<String, DefaultSessionResult<String>> sessionFactory; @Mock DiagnosisEngineConfiguration<String, DefaultSessionResult<String>> config; @Mock DefaultSessionResultCollector<String> resultCollector; /** * Tests the {@link SessionFactory#makeObject()} method. * * @author Alexander Wert * */ public class MakeObject extends SessionFactoryTest { @Test public void makeValid() throws Exception { Set<Class<?>> ruleClasses = new HashSet<>(Arrays.asList(RuleA.class, RuleB.class, RuleC.class)); when(config.getRuleClasses()).thenReturn(ruleClasses); when(config.getResultCollector()).thenReturn(resultCollector); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); Session<String, DefaultSessionResult<String>> session = sessionFactory.makeObject(); assertThat(session.getState(), equalTo(State.NEW)); assertThat(session.getSessionContext().getRuleSet(), empty()); session.activate("input", Collections.<String, Object> emptyMap()); assertThat(session.getState(), equalTo(State.ACTIVATED)); assertThat(session.getSessionContext().getRuleSet(), containsInAnyOrder(Rules.define(RuleA.class, RuleB.class, RuleC.class).toArray())); } @Test(expectedExceptions = { IllegalArgumentException.class }) public void missingRules() throws Exception { when(config.getRuleClasses()).thenReturn(Collections.<Class<?>> emptySet()); when(config.getResultCollector()).thenReturn(resultCollector); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); sessionFactory.makeObject(); } @Test(expectedExceptions = { IllegalArgumentException.class }) public void nullRules() throws Exception { when(config.getRuleClasses()).thenReturn(null); when(config.getResultCollector()).thenReturn(resultCollector); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); sessionFactory.makeObject(); } @Test(expectedExceptions = { NullPointerException.class }) public void nullResultCollector() throws Exception { Set<Class<?>> ruleClasses = new HashSet<>(Arrays.asList(RuleA.class, RuleB.class, RuleC.class)); when(config.getRuleClasses()).thenReturn(ruleClasses); when(config.getResultCollector()).thenReturn(null); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); sessionFactory.makeObject(); } @Test(expectedExceptions = { NullPointerException.class }) public void nullStorage() throws Exception { Set<Class<?>> ruleClasses = new HashSet<>(Arrays.asList(RuleA.class, RuleB.class, RuleC.class)); when(config.getRuleClasses()).thenReturn(ruleClasses); when(config.getResultCollector()).thenReturn(null); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return null; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); sessionFactory.makeObject(); } } /** * Tests the {@link SessionFactory#passivateObject(Object)} method. * * @author Alexander Wert * */ public class PassivateObject extends SessionFactoryTest { @Test public void test() throws Exception { Set<Class<?>> ruleClasses = new HashSet<>(Arrays.asList(RuleA.class, RuleB.class, RuleC.class)); when(config.getRuleClasses()).thenReturn(ruleClasses); when(config.getResultCollector()).thenReturn(resultCollector); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); Session<String, DefaultSessionResult<String>> session = sessionFactory.makeObject(); session.activate("", Collections.<String, Object> emptyMap()); sessionFactory.passivateObject(session); assertThat(session.getState(), equalTo(State.PASSIVATED)); } } /** * Tests the {@link SessionFactory#destroyObject(Session)} method. * * @author Alexander Wert * */ public class DestroyObject extends SessionFactoryTest { @Test public void test() throws Exception { Set<Class<?>> ruleClasses = new HashSet<>(Arrays.asList(RuleA.class, RuleB.class, RuleC.class)); when(config.getRuleClasses()).thenReturn(ruleClasses); when(config.getResultCollector()).thenReturn(resultCollector); Answer<Class<? extends IRuleOutputStorage>> callableAnswer = new Answer<Class<? extends IRuleOutputStorage>>() { @Override public Class<? extends IRuleOutputStorage> answer(InvocationOnMock invocation) throws Throwable { return DefaultRuleOutputStorage.class; } }; doAnswer(callableAnswer).when(config).getStorageClass(); sessionFactory = new SessionFactory<>(config); Session<String, DefaultSessionResult<String>> session = sessionFactory.makeObject(); session.activate("", Collections.<String, Object> emptyMap()); sessionFactory.destroyObject(session); assertThat(session.getState(), equalTo(State.DESTROYED)); } } }