/*
* Copyright (c) 2010-2016 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.common;
import static org.testng.AssertJUnit.assertEquals;
import java.io.IOException;
import javax.xml.datatype.XMLGregorianCalendar;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.MidPointPrismContextFactory;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.util.PrettyPrinter;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TimeIntervalStatusType;
/**
* @author semancik
*
*/
public class TestActivationComputer {
private static final XMLGregorianCalendar YEAR_START = XmlTypeConverter.createXMLGregorianCalendar(2013, 1, 1, 0, 0, 0);
private static final XMLGregorianCalendar SPRING_EQUINOX = XmlTypeConverter.createXMLGregorianCalendar(2013, 3, 20, 11, 2, 00);
private static final XMLGregorianCalendar SUMMER_SOLSTICE = XmlTypeConverter.createXMLGregorianCalendar(2013, 6, 21, 5, 4, 00);
private static final XMLGregorianCalendar AUTUMN_EQUINOX = XmlTypeConverter.createXMLGregorianCalendar(2013, 9, 22, 20, 4, 00);
private static final XMLGregorianCalendar WINTER_SOLSTICE = XmlTypeConverter.createXMLGregorianCalendar(2013, 12, 21, 17, 11, 00);
private static final XMLGregorianCalendar YEAR_END = XmlTypeConverter.createXMLGregorianCalendar(2013, 12, 31, 23, 59, 59);
@BeforeSuite
public void setup() throws SchemaException, SAXException, IOException {
PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX);
PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY);
}
@Test
public void testGetAdministrativeEnabled() throws Exception {
System.out.println("\n===[ testGetAdministrativeEnabled ]===\n");
// GIVEN
Clock clock = createClock(YEAR_START);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.ENABLED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(null, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.ENABLED, effectiveStatus);
}
@Test
public void testGetAdministrativeDisabled() throws Exception {
System.out.println("\n===[ testGetAdministrativeDisabled ]===\n");
// GIVEN
Clock clock = createClock(SUMMER_SOLSTICE);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.DISABLED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(null, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.DISABLED, effectiveStatus);
}
@Test
public void testGetAdministrativeArchived() throws Exception {
System.out.println("\n===[ testGetAdministrativeArchived ]===\n");
// GIVEN
Clock clock = createClock(SUMMER_SOLSTICE);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.ARCHIVED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(null, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.ARCHIVED, effectiveStatus);
}
@Test
public void testGetDraftAdministrativeEnabled() throws Exception {
System.out.println("\n===[ testGetDraftAdministrativeEnabled ]===\n");
// GIVEN
Clock clock = createClock(YEAR_START);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.DISABLED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(SchemaConstants.LIFECYCLE_DRAFT, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.DISABLED, effectiveStatus);
}
@Test
public void testGetProposedAdministrativeEnabled() throws Exception {
System.out.println("\n===[ testGetProposedAdministrativeEnabled ]===\n");
// GIVEN
Clock clock = createClock(YEAR_START);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.DISABLED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(SchemaConstants.LIFECYCLE_PROPOSED, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.DISABLED, effectiveStatus);
}
@Test
public void testGetActiveAdministrativeEnabled() throws Exception {
System.out.println("\n===[ testGetActiveAdministrativeEnabled ]===\n");
// GIVEN
Clock clock = createClock(YEAR_START);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.ENABLED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(SchemaConstants.LIFECYCLE_ACTIVE, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.ENABLED, effectiveStatus);
}
@Test
public void testGetActiveAdministrativeDisabled() throws Exception {
System.out.println("\n===[ testGetActiveAdministrativeDisabled ]===\n");
// GIVEN
Clock clock = createClock(YEAR_START);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.DISABLED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(SchemaConstants.LIFECYCLE_ACTIVE, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.DISABLED, effectiveStatus);
}
@Test
public void testGetDeprecatedAdministrativeDisabled() throws Exception {
System.out.println("\n===[ testGetDeprecatedAdministrativeDisabled ]===\n");
// GIVEN
Clock clock = createClock(SUMMER_SOLSTICE);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.DISABLED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(SchemaConstants.LIFECYCLE_DEPRECATED, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.DISABLED, effectiveStatus);
}
@Test
public void testGetDeprecatedAdministrativeEnabled() throws Exception {
System.out.println("\n===[ testGetDeprecatedAdministrativeEnabled ]===\n");
// GIVEN
Clock clock = createClock(SUMMER_SOLSTICE);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.ENABLED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(SchemaConstants.LIFECYCLE_DEPRECATED, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.ENABLED, effectiveStatus);
}
@Test
public void testGetActiveAdministrativeArchived() throws Exception {
System.out.println("\n===[ testGetAdministrativeArchived ]===\n");
// GIVEN
Clock clock = createClock(SUMMER_SOLSTICE);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.ARCHIVED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(SchemaConstants.LIFECYCLE_ACTIVE, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.ARCHIVED, effectiveStatus);
}
@Test
public void testGetArchivedAdministrativeEnabled() throws Exception {
System.out.println("\n===[ testGetArchivedAdministrativeEnabled ]===\n");
// GIVEN
Clock clock = createClock(SUMMER_SOLSTICE);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(ActivationStatusType.ENABLED, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(SchemaConstants.LIFECYCLE_ARCHIVED, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.ARCHIVED, effectiveStatus);
}
@Test
public void testGetBeforeValidity() throws Exception {
System.out.println("\n===[ testGetBeforeValidity ]===\n");
// GIVEN
Clock clock = createClock(YEAR_START);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(null, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(null, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.DISABLED, effectiveStatus);
}
@Test
public void testGetInValidity() throws Exception {
System.out.println("\n===[ testGetInValidity ]===\n");
// GIVEN
Clock clock = createClock(SUMMER_SOLSTICE);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(null, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(null, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.ENABLED, effectiveStatus);
}
@Test
public void testGetAfterValidity() throws Exception {
System.out.println("\n===[ testGetAfterValidity ]===\n");
// GIVEN
Clock clock = createClock(WINTER_SOLSTICE);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(null, SPRING_EQUINOX, AUTUMN_EQUINOX);
// WHEN
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(null, activationType);
// THEN
assertEquals("Unexpected effective status", ActivationStatusType.DISABLED, effectiveStatus);
}
@Test
public void testComputeAdministrativeEnabledBefore() throws Exception {
testCompute("testComputeAdministrativeEnabledBefore", YEAR_START,
ActivationStatusType.ENABLED, SPRING_EQUINOX, AUTUMN_EQUINOX,
ActivationStatusType.ENABLED, TimeIntervalStatusType.BEFORE);
}
@Test
public void testComputeAdministrativeEnabledIn() throws Exception {
testCompute("testComputeAdministrativeEnabledIn", SUMMER_SOLSTICE,
ActivationStatusType.ENABLED, SPRING_EQUINOX, AUTUMN_EQUINOX,
ActivationStatusType.ENABLED, TimeIntervalStatusType.IN);
}
@Test
public void testComputeAdministrativeEnabledAfter() throws Exception {
testCompute("testComputeAdministrativeEnabledBefore", WINTER_SOLSTICE,
ActivationStatusType.ENABLED, SPRING_EQUINOX, AUTUMN_EQUINOX,
ActivationStatusType.ENABLED, TimeIntervalStatusType.AFTER);
}
@Test
public void testComputeAdministrativeArchivedBefore() throws Exception {
testCompute("testComputeAdministrativeArchivedBefore", YEAR_START,
ActivationStatusType.ARCHIVED, SPRING_EQUINOX, AUTUMN_EQUINOX,
ActivationStatusType.ARCHIVED, TimeIntervalStatusType.BEFORE);
}
@Test
public void testComputeAdministrativeDisabledIn() throws Exception {
testCompute("testComputeAdministrativeDisabledIn", SUMMER_SOLSTICE,
ActivationStatusType.DISABLED, SPRING_EQUINOX, AUTUMN_EQUINOX,
ActivationStatusType.DISABLED, TimeIntervalStatusType.IN);
}
@Test
public void testComputeAdministrativeDisabledAfter() throws Exception {
testCompute("testComputeAdministrativeDisabledAfter", WINTER_SOLSTICE,
ActivationStatusType.DISABLED, SPRING_EQUINOX, AUTUMN_EQUINOX,
ActivationStatusType.DISABLED, TimeIntervalStatusType.AFTER);
}
@Test
public void testComputeBefore() throws Exception {
testCompute("testComputeAdministrativeEnabledBefore", YEAR_START,
null, SPRING_EQUINOX, AUTUMN_EQUINOX,
ActivationStatusType.DISABLED, TimeIntervalStatusType.BEFORE);
}
@Test
public void testComputeIn() throws Exception {
testCompute("testComputeAdministrativeEnabledIn", SUMMER_SOLSTICE,
null, SPRING_EQUINOX, AUTUMN_EQUINOX,
ActivationStatusType.ENABLED, TimeIntervalStatusType.IN);
}
@Test
public void testComputeAfter() throws Exception {
testCompute("testComputeAdministrativeEnabledBefore", WINTER_SOLSTICE,
null, SPRING_EQUINOX, AUTUMN_EQUINOX,
ActivationStatusType.DISABLED, TimeIntervalStatusType.AFTER);
}
void testCompute(final String TEST_NAME, XMLGregorianCalendar now, ActivationStatusType administrativeStatus, XMLGregorianCalendar validFrom,
XMLGregorianCalendar validTo, ActivationStatusType expectedEffective, TimeIntervalStatusType expectedValidity) {
System.out.println("\n===[ "+TEST_NAME+" ]===\n");
testCompute(TEST_NAME, null, now, administrativeStatus, validFrom, validTo, expectedEffective, expectedValidity);
testCompute(TEST_NAME, SchemaConstants.LIFECYCLE_DRAFT, now, administrativeStatus, validFrom, validTo, ActivationStatusType.DISABLED, expectedValidity);
testCompute(TEST_NAME, SchemaConstants.LIFECYCLE_PROPOSED, now, administrativeStatus, validFrom, validTo, ActivationStatusType.DISABLED, expectedValidity);
testCompute(TEST_NAME, SchemaConstants.LIFECYCLE_ACTIVE, now, administrativeStatus, validFrom, validTo, expectedEffective, expectedValidity);
testCompute(TEST_NAME, SchemaConstants.LIFECYCLE_DEPRECATED, now, administrativeStatus, validFrom, validTo, expectedEffective, expectedValidity);
testCompute(TEST_NAME, SchemaConstants.LIFECYCLE_FAILED, now, administrativeStatus, validFrom, validTo, ActivationStatusType.DISABLED, expectedValidity);
testCompute(TEST_NAME, SchemaConstants.LIFECYCLE_ARCHIVED, now, administrativeStatus, validFrom, validTo, ActivationStatusType.ARCHIVED, expectedValidity);
}
void testCompute(final String TEST_NAME, String lifecycleState, XMLGregorianCalendar now, ActivationStatusType administrativeStatus, XMLGregorianCalendar validFrom,
XMLGregorianCalendar validTo, ActivationStatusType expectedEffective, TimeIntervalStatusType expectedValidity) {
// GIVEN
Clock clock = createClock(now);
ActivationComputer activationComputer = createActivationComputer(clock);
ActivationType activationType = createActivationType(administrativeStatus, validFrom, validTo);
// WHEN
activationComputer.computeEffective(lifecycleState, activationType);
// THEN
assertEquals("Unexpected effective status", expectedEffective, activationType.getEffectiveStatus());
assertEquals("Unexpected validity status", expectedValidity, activationType.getValidityStatus());
}
private ActivationComputer createActivationComputer(Clock clock) {
ActivationComputer activationComputer = new ActivationComputer(clock);
return activationComputer;
}
private Clock createClock(XMLGregorianCalendar date) {
Clock clock = new Clock();
clock.override(date);
return clock;
}
private ActivationType createActivationType(ActivationStatusType administrativeStatus, XMLGregorianCalendar validFrom,
XMLGregorianCalendar validTo) {
ActivationType activationType = new ActivationType();
activationType.setAdministrativeStatus(administrativeStatus);
activationType.setValidFrom(validFrom);
activationType.setValidTo(validTo);
return activationType;
}
}