/*
* Copyright (c) 2010-2015 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.model.common.mapping;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNull;
import java.io.IOException;
import javax.xml.datatype.XMLGregorianCalendar;
import com.evolveum.midpoint.prism.PrismPropertyDefinitionImpl;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
/**
* @author Radovan Semancik
*/
public class TestMappingTime {
private static final String MAPPING_TIME_FROM_TO_FILENAME = "mapping-time-from-to.xml";
private static final String MAPPING_TIME_ACTIVATION = "mapping-time-deferred-delete.xml";
private static final XMLGregorianCalendar TIME_PAST = XmlTypeConverter.createXMLGregorianCalendar(2001, 2, 3, 4, 5, 6);
private static final XMLGregorianCalendar TIME_BETWEEN = XmlTypeConverter.createXMLGregorianCalendar(2013, 6, 3, 12, 15, 0);
private static final XMLGregorianCalendar TIME_FUTURE = XmlTypeConverter.createXMLGregorianCalendar(2066, 5, 4, 3, 2, 1);
private static final XMLGregorianCalendar TIME_MAPPING_DISABLED_PLUS_1D = XmlTypeConverter.createXMLGregorianCalendar(2013, 5, 31, 9, 30, 0);
private static final XMLGregorianCalendar TIME_MAPPING_DISABLED_PLUS_10D = XmlTypeConverter.createXMLGregorianCalendar(2013, 6, 9, 9, 30, 0);
private static final XMLGregorianCalendar TIME_MAPPING_DISABLED_PLUS_1M = XmlTypeConverter.createXMLGregorianCalendar(2013, 6, 30, 9, 30, 0);
private MappingTestEvaluator evaluator;
@BeforeClass
public void setupFactory() throws SAXException, IOException, SchemaException {
evaluator = new MappingTestEvaluator();
evaluator.init();
}
@Test
public void testBeforeTimeFrom() throws Exception {
final String TEST_NAME = "testBeforeTimeFrom";
System.out.println("===[ "+TEST_NAME+"]===");
// GIVEN
ObjectDelta<UserType> delta = ObjectDelta.createModificationReplaceProperty(UserType.class, evaluator.USER_OLD_OID,
UserType.F_EMPLOYEE_TYPE, evaluator.getPrismContext(), "CAPTAIN");
Mapping.Builder<PrismPropertyValue<PolyString>,PrismPropertyDefinition<PolyString>> builder = evaluator.createMappingBuilder(
MAPPING_TIME_FROM_TO_FILENAME,
TEST_NAME, "title", delta);
builder.setNow(TIME_PAST);
Mapping<PrismPropertyValue<PolyString>,PrismPropertyDefinition<PolyString>> mapping = builder.build();
OperationResult opResult = new OperationResult(TEST_NAME);
// WHEN
mapping.evaluate(null, opResult);
// THEN
PrismValueDeltaSetTriple<PrismPropertyValue<PolyString>> outputTriple = mapping.getOutputTriple();
assertNullTriple(outputTriple);
assertNextRecompute(mapping, TIME_MAPPING_DISABLED_PLUS_1D);
}
@Test
public void testBetweenTimes() throws Exception {
final String TEST_NAME = "testBetweenTimes";
System.out.println("===[ "+TEST_NAME+"]===");
// GIVEN
ObjectDelta<UserType> delta = ObjectDelta.createModificationReplaceProperty(UserType.class, evaluator.USER_OLD_OID,
UserType.F_EMPLOYEE_TYPE, evaluator.getPrismContext(), "CAPTAIN");
Mapping.Builder<PrismPropertyValue<PolyString>,PrismPropertyDefinition<PolyString>> builder = evaluator.createMappingBuilder(
MAPPING_TIME_FROM_TO_FILENAME,
TEST_NAME, "title", delta);
builder.setNow(TIME_BETWEEN);
Mapping<PrismPropertyValue<PolyString>,PrismPropertyDefinition<PolyString>> mapping = builder.build();
OperationResult opResult = new OperationResult(TEST_NAME);
// WHEN
mapping.evaluate(null, opResult);
// THEN
PrismValueDeltaSetTriple<PrismPropertyValue<PolyString>> outputTriple = mapping.getOutputTriple();
PrismAsserts.assertTripleNoZero(outputTriple);
PrismAsserts.assertTriplePlus(outputTriple, PrismTestUtil.createPolyString("CAPTAIN"));
PrismAsserts.assertTripleMinus(outputTriple, PrismTestUtil.createPolyString("PIRATE"));
assertNextRecompute(mapping, TIME_MAPPING_DISABLED_PLUS_10D);
}
@Test
public void testAfterTimeTo() throws Exception {
final String TEST_NAME = "testAfterTimeTo";
System.out.println("===[ "+TEST_NAME+"]===");
// GIVEN
ObjectDelta<UserType> delta = ObjectDelta.createModificationReplaceProperty(UserType.class, evaluator.USER_OLD_OID,
UserType.F_EMPLOYEE_TYPE, evaluator.getPrismContext(), "CAPTAIN");
Mapping.Builder<PrismPropertyValue<PolyString>,PrismPropertyDefinition<PolyString>> builder = evaluator.createMappingBuilder(
MAPPING_TIME_FROM_TO_FILENAME,
TEST_NAME, "title", delta);
builder.setNow(TIME_FUTURE);
Mapping<PrismPropertyValue<PolyString>,PrismPropertyDefinition<PolyString>> mapping = builder.build();
OperationResult opResult = new OperationResult(TEST_NAME);
// WHEN
mapping.evaluate(null, opResult);
// THEN
PrismValueDeltaSetTriple<PrismPropertyValue<PolyString>> outputTriple = mapping.getOutputTriple();
assertNullTriple(outputTriple);
assertNextRecompute(mapping, null);
}
@Test
public void testExistenceBefore() throws Exception {
final String TEST_NAME = "testExistenceBefore";
System.out.println("===[ "+TEST_NAME+"]===");
// GIVEN
Mapping.Builder<PrismPropertyValue<Boolean>,PrismPropertyDefinition<Boolean>> builder = evaluator.createMappingBuilder(
MAPPING_TIME_ACTIVATION,
TEST_NAME, "title", null);
builder.setNow(TIME_PAST);
PrismPropertyDefinition<Boolean> existenceDef = new PrismPropertyDefinitionImpl<>(
ExpressionConstants.OUTPUT_ELEMENT_NAME,
DOMUtil.XSD_BOOLEAN, evaluator.getPrismContext());
builder.setDefaultTargetDefinition(existenceDef);
Mapping<PrismPropertyValue<Boolean>,PrismPropertyDefinition<Boolean>> mapping = builder.build();
OperationResult opResult = new OperationResult(TEST_NAME);
// WHEN
mapping.evaluate(null, opResult);
// THEN
PrismValueDeltaSetTriple<PrismPropertyValue<Boolean>> outputTriple = mapping.getOutputTriple();
assertNullTriple(outputTriple);
assertNextRecompute(mapping, TIME_MAPPING_DISABLED_PLUS_1M);
}
@Test
public void testExistenceAfter() throws Exception {
final String TEST_NAME = "testExistenceAfter";
System.out.println("===[ "+TEST_NAME+"]===");
// GIVEN
Mapping.Builder<PrismPropertyValue<Boolean>,PrismPropertyDefinition<Boolean>> builder = evaluator.createMappingBuilder(
MAPPING_TIME_ACTIVATION,
TEST_NAME, "title", null);
builder.setNow(TIME_FUTURE);
PrismPropertyDefinition<Boolean> existenceDef = new PrismPropertyDefinitionImpl<>(
ExpressionConstants.OUTPUT_ELEMENT_NAME,
DOMUtil.XSD_BOOLEAN, evaluator.getPrismContext());
builder.setDefaultTargetDefinition(existenceDef);
Mapping<PrismPropertyValue<Boolean>,PrismPropertyDefinition<Boolean>> mapping = builder.build();
OperationResult opResult = new OperationResult(TEST_NAME);
// WHEN
mapping.evaluate(null, opResult);
// THEN
PrismValueDeltaSetTriple<PrismPropertyValue<Boolean>> outputTriple = mapping.getOutputTriple();
PrismAsserts.assertTripleZero(outputTriple, false);
PrismAsserts.assertTripleNoPlus(outputTriple);
PrismAsserts.assertTripleNoMinus(outputTriple);
assertNextRecompute(mapping, null);
}
@Test
public void testNoReferenceTime() throws Exception {
final String TEST_NAME = "testNoReferenceTime";
System.out.println("===[ "+TEST_NAME+"]===");
// GIVEN
PrismObject<UserType> userOld = evaluator.getUserOld();
userOld.asObjectable().getActivation().setDisableTimestamp(null);
Mapping.Builder<PrismPropertyValue<Boolean>,PrismPropertyDefinition<Boolean>> builder = evaluator.createMappingBuilder(
MAPPING_TIME_ACTIVATION,
TEST_NAME, "title", null, userOld);
builder.setNow(TIME_PAST);
PrismPropertyDefinition<Boolean> existenceDef = new PrismPropertyDefinitionImpl<>(
ExpressionConstants.OUTPUT_ELEMENT_NAME,
DOMUtil.XSD_BOOLEAN, evaluator.getPrismContext());
builder.setDefaultTargetDefinition(existenceDef);
Mapping<PrismPropertyValue<Boolean>,PrismPropertyDefinition<Boolean>> mapping = builder.build();
OperationResult opResult = new OperationResult(TEST_NAME);
// WHEN
mapping.evaluate(null, opResult);
// THEN
PrismValueDeltaSetTriple<PrismPropertyValue<Boolean>> outputTriple = mapping.getOutputTriple();
assertNullTriple(outputTriple);
assertNextRecompute(mapping, null);
}
@Test
public void testSetReferenceTimeBefore() throws Exception {
final String TEST_NAME = "testSetReferenceTimeBefore";
System.out.println("===[ "+TEST_NAME+"]===");
// GIVEN
PrismObject<UserType> userOld = evaluator.getUserOld();
XMLGregorianCalendar disableTimestamp = userOld.asObjectable().getActivation().getDisableTimestamp();
userOld.asObjectable().getActivation().setDisableTimestamp(null);
ObjectDelta<UserType> delta = ObjectDelta.createModificationReplaceProperty(UserType.class, evaluator.USER_OLD_OID,
new ItemPath(UserType.F_ACTIVATION, ActivationType.F_DISABLE_TIMESTAMP), evaluator.getPrismContext(),
disableTimestamp);
Mapping.Builder<PrismPropertyValue<Boolean>,PrismPropertyDefinition<Boolean>> builder = evaluator.createMappingBuilder(
MAPPING_TIME_ACTIVATION,
TEST_NAME, "title", delta, userOld);
builder.setNow(TIME_PAST);
PrismPropertyDefinition<Boolean> existenceDef = new PrismPropertyDefinitionImpl<>(
ExpressionConstants.OUTPUT_ELEMENT_NAME,
DOMUtil.XSD_BOOLEAN, evaluator.getPrismContext());
builder.setDefaultTargetDefinition(existenceDef);
Mapping<PrismPropertyValue<Boolean>,PrismPropertyDefinition<Boolean>> mapping = builder.build();
OperationResult opResult = new OperationResult(TEST_NAME);
// WHEN
mapping.evaluate(null, opResult);
// THEN
PrismValueDeltaSetTriple<PrismPropertyValue<Boolean>> outputTriple = mapping.getOutputTriple();
assertNullTriple(outputTriple);
assertNextRecompute(mapping, TIME_MAPPING_DISABLED_PLUS_1M);
}
@Test
public void testSetReferenceTimeAfter() throws Exception {
final String TEST_NAME = "testSetReferenceTimeAfter";
System.out.println("===[ "+TEST_NAME+"]===");
// GIVEN
PrismObject<UserType> userOld = evaluator.getUserOld();
XMLGregorianCalendar disableTimestamp = userOld.asObjectable().getActivation().getDisableTimestamp();
userOld.asObjectable().getActivation().setDisableTimestamp(null);
ObjectDelta<UserType> delta = ObjectDelta.createModificationReplaceProperty(UserType.class, evaluator.USER_OLD_OID,
new ItemPath(UserType.F_ACTIVATION, ActivationType.F_DISABLE_TIMESTAMP), evaluator.getPrismContext(),
disableTimestamp);
Mapping.Builder<PrismPropertyValue<Boolean>,PrismPropertyDefinition<Boolean>> builder = evaluator.createMappingBuilder(
MAPPING_TIME_ACTIVATION,
TEST_NAME, "title", delta, userOld);
builder.setNow(TIME_FUTURE);
PrismPropertyDefinition<Boolean> existenceDef = new PrismPropertyDefinitionImpl<>(
ExpressionConstants.OUTPUT_ELEMENT_NAME,
DOMUtil.XSD_BOOLEAN, evaluator.getPrismContext());
builder.setDefaultTargetDefinition(existenceDef);
Mapping<PrismPropertyValue<Boolean>,PrismPropertyDefinition<Boolean>> mapping = builder.build();
OperationResult opResult = new OperationResult(TEST_NAME);
// WHEN
mapping.evaluate(null, opResult);
// THEN
PrismValueDeltaSetTriple<PrismPropertyValue<Boolean>> outputTriple = mapping.getOutputTriple();
PrismAsserts.assertTripleZero(outputTriple, false);
PrismAsserts.assertTripleNoPlus(outputTriple);
PrismAsserts.assertTripleNoMinus(outputTriple);
assertNextRecompute(mapping, null);
}
private void assertNullTriple(PrismValueDeltaSetTriple<?> outputTriple) {
assertNull("Unexpected output triple: "+outputTriple, outputTriple);
}
private void assertNextRecompute(Mapping<?,?> mapping, XMLGregorianCalendar expected) {
XMLGregorianCalendar nextRecomputeTime = mapping.getNextRecomputeTime();
assertEquals("Wrong nextRecomputeTime in mapping "+mapping, expected, nextRecomputeTime);
}
}