/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.start.common.validation.internal; import static org.junit.Assert.assertEquals; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; import de.rcenvironment.core.start.common.validation.api.InstanceValidationResult; import de.rcenvironment.core.start.common.validation.api.InstanceValidationResult.InstanceValidationResultType; import de.rcenvironment.core.start.common.validation.api.InstanceValidationResultFactory; import de.rcenvironment.core.start.common.validation.api.InstanceValidationService; import de.rcenvironment.core.start.common.validation.spi.InstanceValidator; /** * Tests for {@linkplain InstanceValidationServiceImpl} . * * @author Tobias Rodehutskors */ public class InstanceValidationServiceImplTest { private static final String B_PASSED = "B passed"; private static final String A_PASSED = "A passed"; private InstanceValidationService service; /** Before. */ @Before public void setUp() { service = new InstanceValidationServiceImpl(); } /** * Dummy class to make sure the class names differ. */ abstract class ValidatorA implements InstanceValidator { } /** * Dummy class to make sure the class names differ. */ abstract class ValidatorB implements InstanceValidator { } private void validateInstanceAndCheckResults(int numPassed, int numFailedProceed, int numFailedShutdown) { Map<InstanceValidationResultType, List<InstanceValidationResult>> results = service.validateInstance(); assertEquals(numPassed, results.get(InstanceValidationResultType.PASSED).size()); assertEquals(numFailedProceed, results.get(InstanceValidationResultType.FAILED_PROCEEDING_ALLOWED).size()); assertEquals(numFailedShutdown, results.get(InstanceValidationResultType.FAILED_SHUTDOWN_REQUIRED).size()); } /** * Validator without a required predecessor. Should be executed without error. */ @Test public void testValidatorWithoutPredecessors() { InstanceValidator validatorA = EasyMock.createStrictMock(ValidatorA.class); EasyMock.expect(validatorA.getNecessaryPredecessors()).andReturn(null); EasyMock.expect(validatorA.validate()).andReturn(InstanceValidationResultFactory.createResultForPassed(A_PASSED)); EasyMock.replay(validatorA); ((InstanceValidationServiceImpl) service).bindInstanceValidator(validatorA); validateInstanceAndCheckResults(1, 0, 0); EasyMock.verify(validatorA); } /** * Two validators. One requiring the other in already correct order. Should be executed without error. */ @Test public void testValidatorWithExistingPredecessor() { InstanceValidator validatorA = EasyMock.createStrictMock(ValidatorA.class); EasyMock.expect(validatorA.getNecessaryPredecessors()).andReturn(null); EasyMock.expect(validatorA.validate()).andReturn(InstanceValidationResultFactory.createResultForPassed(A_PASSED)); EasyMock.replay(validatorA); InstanceValidator validatorB = EasyMock.createStrictMock(ValidatorB.class); List<Class<? extends InstanceValidator>> validatorBnecessaryPredecessors = new LinkedList<Class<? extends InstanceValidator>>(); validatorBnecessaryPredecessors.add(validatorA.getClass()); EasyMock.expect(validatorB.getNecessaryPredecessors()).andReturn(validatorBnecessaryPredecessors); EasyMock.expect(validatorB.validate()).andReturn(InstanceValidationResultFactory.createResultForPassed(B_PASSED)); EasyMock.replay(validatorB); ((InstanceValidationServiceImpl) service).bindInstanceValidator(validatorA); ((InstanceValidationServiceImpl) service).bindInstanceValidator(validatorB); validateInstanceAndCheckResults(2, 0, 0); EasyMock.verify(validatorA); EasyMock.verify(validatorB); } /** * Two validators. One requiring the other which requires reordering. Should be executed without error. */ @Test public void testValidatorWithExistingPredecessorReorderingRequired() { InstanceValidator validatorA = EasyMock.createStrictMock(ValidatorA.class); EasyMock.expect(validatorA.getNecessaryPredecessors()).andReturn(null); EasyMock.expect(validatorA.validate()).andReturn(InstanceValidationResultFactory.createResultForPassed(A_PASSED)); EasyMock.replay(validatorA); InstanceValidator validatorB = EasyMock.createStrictMock(ValidatorB.class); List<Class<? extends InstanceValidator>> validatorBnecessaryPredecessors = new LinkedList<Class<? extends InstanceValidator>>(); validatorBnecessaryPredecessors.add(validatorA.getClass()); EasyMock.expect(validatorB.getNecessaryPredecessors()).andReturn(validatorBnecessaryPredecessors).atLeastOnce(); EasyMock.expect(validatorB.validate()).andReturn(InstanceValidationResultFactory.createResultForPassed(B_PASSED)); EasyMock.replay(validatorB); ((InstanceValidationServiceImpl) service).bindInstanceValidator(validatorB); ((InstanceValidationServiceImpl) service).bindInstanceValidator(validatorA); validateInstanceAndCheckResults(2, 0, 0); EasyMock.verify(validatorA); EasyMock.verify(validatorB); } /** * Two validators. One requiring the other which is not available to the {@link InstanceValidationServiceImpl}. Should result in an * error. */ @Test public void testValidatorWithMissingPredecessor() { InstanceValidator validatorA = EasyMock.createStrictMock(ValidatorA.class); EasyMock.replay(validatorA); InstanceValidator validatorB = EasyMock.createStrictMock(ValidatorB.class); List<Class<? extends InstanceValidator>> validatorBnecessaryPredecessors = new LinkedList<Class<? extends InstanceValidator>>(); validatorBnecessaryPredecessors.add(validatorA.getClass()); EasyMock.expect(validatorB.getNecessaryPredecessors()).andReturn(validatorBnecessaryPredecessors).atLeastOnce(); EasyMock.replay(validatorB); ((InstanceValidationServiceImpl) service).bindInstanceValidator(validatorB); validateInstanceAndCheckResults(0, 0, 1); EasyMock.verify(validatorA); EasyMock.verify(validatorB); } /** * Two validator with a cyclic dependency. Should result in an error. */ @Test public void testValidatorsWithCyclicDependency() { InstanceValidator validatorA = EasyMock.createStrictMock(ValidatorA.class); InstanceValidator validatorB = EasyMock.createStrictMock(ValidatorB.class); List<Class<? extends InstanceValidator>> validatorAnecessaryPredecessors = new LinkedList<Class<? extends InstanceValidator>>(); validatorAnecessaryPredecessors.add(validatorB.getClass()); EasyMock.expect(validatorA.getNecessaryPredecessors()).andReturn(validatorAnecessaryPredecessors); EasyMock.replay(validatorA); List<Class<? extends InstanceValidator>> validatorBnecessaryPredecessors = new LinkedList<Class<? extends InstanceValidator>>(); validatorBnecessaryPredecessors.add(validatorA.getClass()); EasyMock.expect(validatorB.getNecessaryPredecessors()).andReturn(validatorBnecessaryPredecessors); EasyMock.replay(validatorB); ((InstanceValidationServiceImpl) service).bindInstanceValidator(validatorA); ((InstanceValidationServiceImpl) service).bindInstanceValidator(validatorB); validateInstanceAndCheckResults(0, 0, 1); EasyMock.verify(validatorA); EasyMock.verify(validatorB); } /** * Two validators. One requiring the other in already correct order. But the first validator fails. Should not execute the second * validator. */ @Test public void testValidatorWithFailedPredecessor() { InstanceValidator validatorA = EasyMock.createStrictMock(ValidatorA.class); EasyMock.expect(validatorA.getNecessaryPredecessors()).andReturn(null); EasyMock.expect(validatorA.validate()).andReturn( InstanceValidationResultFactory.createResultForFailureWhichRequiresInstanceShutdown("", "", "")); EasyMock.replay(validatorA); InstanceValidator validatorB = EasyMock.createStrictMock(ValidatorB.class); List<Class<? extends InstanceValidator>> validatorBnecessaryPredecessors = new LinkedList<Class<? extends InstanceValidator>>(); validatorBnecessaryPredecessors.add(validatorA.getClass()); EasyMock.expect(validatorB.getNecessaryPredecessors()).andReturn(validatorBnecessaryPredecessors).atLeastOnce(); EasyMock.replay(validatorB); ((InstanceValidationServiceImpl) service).bindInstanceValidator(validatorA); ((InstanceValidationServiceImpl) service).bindInstanceValidator(validatorB); validateInstanceAndCheckResults(0, 0, 2); EasyMock.verify(validatorA); EasyMock.verify(validatorB); } }