/*
* 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.prism;
import static org.testng.AssertJUnit.assertNull;
import static com.evolveum.midpoint.prism.PrismInternalTestUtil.*;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import java.io.IOException;
import java.util.Collection;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.PropertyDelta;
import com.evolveum.midpoint.prism.foo.AssignmentType;
import com.evolveum.midpoint.prism.foo.UserType;
import com.evolveum.midpoint.prism.path.IdItemPathSegment;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.path.NameItemPathSegment;
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.util.DebugUtil;
import com.evolveum.midpoint.util.PrettyPrinter;
import com.evolveum.midpoint.util.exception.SchemaException;
/**
* @author semancik
*
*/
public class TestDiff {
@BeforeSuite
public void setupDebug() throws SchemaException, SAXException, IOException {
PrettyPrinter.setDefaultNamespacePrefix(DEFAULT_NAMESPACE_PREFIX);
PrismTestUtil.resetPrismContext(new PrismInternalTestUtil());
}
@Test
public void testUserSimplePropertyDiffNoChange() throws Exception {
System.out.println("\n\n===[ testUserSimplePropertyDiffNoChange ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
user1.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("test name"));
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
user2.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("test name"));
// WHEN
ObjectDelta<UserType> delta = user1.diff(user2);
// THEN
assertNotNull(delta);
assertEquals("Unexpected number of midifications", 0, delta.getModifications().size());
assertEquals("Wrong OID", USER_JACK_OID, delta.getOid());
delta.checkConsistence();
}
@Test
public void testPropertySimplePropertyDiffNoChange() throws Exception {
System.out.println("\n\n===[ testPropertySimplePropertyDiffNoChange ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
user1.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("test name"));
PrismProperty<PolyString> user1NameProp = user1.findProperty(UserType.F_NAME);
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
user2.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("test name"));
PrismProperty<PolyString> user2NameProp = user2.findProperty(UserType.F_NAME);
// WHEN
PropertyDelta<PolyString> delta = user1NameProp.diff(user2NameProp);
// THEN
assertNull(delta);
}
@Test
public void testPropertySimplePropertyDiffNoChangeStatic() throws Exception {
System.out.println("\n\n===[ testPropertySimplePropertyDiffNoChangeStatic ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
user1.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("test name"));
PrismProperty<PolyString> user1NameProp = user1.findProperty(UserType.F_NAME);
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
user2.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("test name"));
PrismProperty<PolyString> user2NameProp = user2.findProperty(UserType.F_NAME);
// WHEN
PropertyDelta<PolyString> delta = PrismProperty.diff(user1NameProp, user2NameProp);
// THEN
assertNull(delta);
}
@Test
public void testUserSimplePropertyDiffReplace() throws Exception {
System.out.println("\n\n===[ testUserSimplePropertyDiffReplace ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
user1.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("test name"));
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
user2.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("other name"));
// WHEN
ObjectDelta<UserType> delta = user1.diff(user2);
// THEN
assertNotNull(delta);
System.out.println(delta.debugDump());
assertEquals("Unexpected number of midifications", 1, delta.getModifications().size());
PrismAsserts.assertPropertyReplace(delta, UserType.F_NAME, PrismTestUtil.createPolyString("other name"));
assertEquals("Wrong OID", USER_JACK_OID, delta.getOid());
delta.checkConsistence();
}
@Test
public void testPropertyUserSimplePropertyDiffReplace() throws Exception {
System.out.println("\n\n===[ testPropertyUserSimplePropertyDiffReplace ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
user1.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("test name"));
PrismProperty<PolyString> user1NameProp = user1.findProperty(UserType.F_NAME);
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
user2.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("other name"));
PrismProperty<PolyString> user2NameProp = user2.findProperty(UserType.F_NAME);
// WHEN
PropertyDelta<PolyString> delta = user1NameProp.diff(user2NameProp);
// THEN
assertNotNull(delta);
System.out.println(delta.debugDump());
PrismAsserts.assertReplace(delta, PrismTestUtil.createPolyString("other name"));
delta.checkConsistence();
}
@Test
public void testPropertyUserSimplePropertyDiffReplaceStatic() throws Exception {
System.out.println("\n\n===[ testPropertyUserSimplePropertyDiffReplaceStatic ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
user1.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("test name"));
PrismProperty<PolyString> user1NameProp = user1.findProperty(UserType.F_NAME);
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
user2.setPropertyRealValue(UserType.F_NAME, PrismTestUtil.createPolyString("other name"));
PrismProperty<PolyString> user2NameProp = user2.findProperty(UserType.F_NAME);
// WHEN
PropertyDelta<PolyString> delta = PrismProperty.diff(user1NameProp, user2NameProp);
// THEN
assertNotNull(delta);
System.out.println(delta.debugDump());
PrismAsserts.assertReplace(delta, PrismTestUtil.createPolyString("other name"));
delta.checkConsistence();
}
@Test
public void testUserSimpleDiffMultiNoChange() throws Exception {
System.out.println("\n\n===[ testUserSimpleDiffMultiNoChange ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
PrismProperty<String> anamesProp1 = user1.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
anamesProp1.addRealValue("foo");
anamesProp1.addRealValue("bar");
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
PrismProperty<String> anamesProp2 = user2.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
anamesProp2.addRealValue("foo");
anamesProp2.addRealValue("bar");
// WHEN
ObjectDelta<UserType> delta = user1.diff(user2);
// THEN
assertNotNull(delta);
assertEquals("Unexpected number of midifications", 0, delta.getModifications().size());
assertEquals("Wrong OID", USER_JACK_OID, delta.getOid());
delta.checkConsistence();
}
@Test
public void testPropertyUserSimpleDiffMultiNoChange() throws Exception {
System.out.println("\n\n===[ testPropertyUserSimpleDiffMultiNoChange ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
PrismProperty<String> additionalNamesProp1 = user1.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
additionalNamesProp1.addRealValue("foo");
additionalNamesProp1.addRealValue("bar");
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
PrismProperty<String> additionalNamesProp2 = user2.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
additionalNamesProp2.addRealValue("foo");
additionalNamesProp2.addRealValue("bar");
// WHEN
PropertyDelta<String> delta = additionalNamesProp1.diff(additionalNamesProp2);
// THEN
assertNull(delta);
}
@Test
public void testPropertyUserSimpleDiffMultiNoChangeStatic() throws Exception {
System.out.println("\n\n===[ testPropertyUserSimpleDiffMultiNoChangeStatic ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
PrismProperty<String> additionalNamesProp1 = user1.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
additionalNamesProp1.addRealValue("foo");
additionalNamesProp1.addRealValue("bar");
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
PrismProperty<String> additionalNamesProp2 = user2.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
additionalNamesProp2.addRealValue("foo");
additionalNamesProp2.addRealValue("bar");
// WHEN
PropertyDelta<String> delta = PrismProperty.diff(additionalNamesProp1, additionalNamesProp2);
// THEN
assertNull(delta);
}
@Test
public void testUserSimpleDiffMultiAdd() throws Exception {
System.out.println("\n\n===[ testUserSimpleDiffMulti ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
PrismProperty<String> anamesProp1 = user1.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
anamesProp1.addRealValue("foo");
anamesProp1.addRealValue("bar");
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
PrismProperty<String> anamesProp2 = user2.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
anamesProp2.addRealValue("foo");
anamesProp2.addRealValue("bar");
anamesProp2.addRealValue("baz");
// WHEN
ObjectDelta<UserType> delta = user1.diff(user2);
// THEN
assertNotNull(delta);
System.out.println(delta.debugDump());
assertEquals("Unexpected number of midifications", 1, delta.getModifications().size());
PrismAsserts.assertPropertyAdd(delta, UserType.F_ADDITIONAL_NAMES, "baz");
assertEquals("Wrong OID", USER_JACK_OID, delta.getOid());
delta.checkConsistence();
}
@Test
public void testPropertyUserSimpleDiffMultiAdd() throws Exception {
System.out.println("\n\n===[ testPropertyUserSimpleDiffMultiAdd ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
PrismProperty<String> additionalNamesProp1 = user1.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
additionalNamesProp1.addRealValue("foo");
additionalNamesProp1.addRealValue("bar");
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
PrismProperty<String> additionalNamesProp2 = user2.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
additionalNamesProp2.addRealValue("foo");
additionalNamesProp2.addRealValue("bar");
additionalNamesProp2.addRealValue("baz");
// WHEN
PropertyDelta<String> delta = additionalNamesProp1.diff(additionalNamesProp2);
// THEN
assertNotNull(delta);
System.out.println(delta.debugDump());
PrismAsserts.assertAdd(delta, "baz");
delta.checkConsistence();
}
@Test
public void testPropertyUserSimpleDiffMultiAddStatic() throws Exception {
System.out.println("\n\n===[ testPropertyUserSimpleDiffMultiAddStatic ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user1 = userDef.instantiate();
user1.setOid(USER_JACK_OID);
PrismProperty<String> additionalNamesProp1 = user1.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
additionalNamesProp1.addRealValue("foo");
additionalNamesProp1.addRealValue("bar");
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
PrismProperty<String> additionalNamesProp2 = user2.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
additionalNamesProp2.addRealValue("foo");
additionalNamesProp2.addRealValue("bar");
additionalNamesProp2.addRealValue("baz");
// WHEN
PropertyDelta<String> delta = PrismProperty.diff(additionalNamesProp1, additionalNamesProp2);
// THEN
assertNotNull(delta);
System.out.println(delta.debugDump());
PrismAsserts.assertAdd(delta, "baz");
delta.checkConsistence();
}
@Test
public void testPropertyUserSimpleDiffMultiAddStaticNull1() throws Exception {
System.out.println("\n\n===[ testPropertyUserSimpleDiffMultiAddStaticNull1 ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
PrismProperty<String> additionalNamesProp2 = user2.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
additionalNamesProp2.addRealValue("foo");
additionalNamesProp2.addRealValue("bar");
// WHEN
PropertyDelta<String> delta = PrismProperty.diff(null, additionalNamesProp2);
// THEN
assertNotNull(delta);
System.out.println(delta.debugDump());
PrismAsserts.assertAdd(delta, "foo", "bar");
delta.checkConsistence();
}
@Test
public void testPropertyUserSimpleDiffMultiAddStaticNull2() throws Exception {
System.out.println("\n\n===[ testPropertyUserSimpleDiffMultiAddStaticNull2 ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismObject<UserType> user2 = userDef.instantiate();
user2.setOid(USER_JACK_OID);
PrismProperty<String> additionalNamesProp1 = user2.findOrCreateProperty(UserType.F_ADDITIONAL_NAMES);
additionalNamesProp1.addRealValue("bar");
additionalNamesProp1.addRealValue("baz");
// WHEN
PropertyDelta<String> delta = PrismProperty.diff(additionalNamesProp1, null);
// THEN
assertNotNull(delta);
System.out.println(delta.debugDump());
PrismAsserts.assertDelete(delta, "bar", "baz");
delta.checkConsistence();
}
@Test
public void testContainerSimpleDiffModificationsNoChange() throws Exception {
System.out.println("\n\n===[ testContainerSimpleDiffModificationsNoChange ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismContainerDefinition<AssignmentType> assignmentContDef = userDef.findContainerDefinition(UserType.F_ASSIGNMENT);
PrismContainer<AssignmentType> ass1 = assignmentContDef.instantiate();
PrismContainerValue<AssignmentType> ass1cval = ass1.createNewValue();
ass1cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah", PrismTestUtil.getPrismContext());
PrismContainer<AssignmentType> ass2 = assignmentContDef.instantiate();
PrismContainerValue<AssignmentType> ass2cval = ass2.createNewValue();
ass2cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah", PrismTestUtil.getPrismContext());
// WHEN
Collection<? extends ItemDelta> modifications = ass1.diffModifications(ass2);
// THEN
assertNotNull(modifications);
System.out.println(DebugUtil.debugDump(modifications));
assertEquals("Unexpected number of midifications", 0, modifications.size());
ItemDelta.checkConsistence(modifications);
}
@Test
public void testContainerDiffModificationsDesciption() throws Exception {
System.out.println("\n\n===[ testContainerDiffModificationsDesciption ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismContainerDefinition<AssignmentType> assignmentContDef = userDef.findContainerDefinition(UserType.F_ASSIGNMENT);
PrismContainer<AssignmentType> ass1 = assignmentContDef.instantiate();
PrismContainerValue<AssignmentType> ass1cval = ass1.createNewValue();
ass1cval.setId(1L);
ass1cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah", PrismTestUtil.getPrismContext());
PrismContainer<AssignmentType> ass2 = assignmentContDef.instantiate();
PrismContainerValue<AssignmentType> ass2cval = ass2.createNewValue();
ass2cval.setId(1L);
ass2cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "chamalalia patlama paprtala", PrismTestUtil.getPrismContext());
// WHEN
Collection<? extends ItemDelta> modifications = ass1.diffModifications(ass2);
// THEN
assertNotNull(modifications);
System.out.println(DebugUtil.debugDump(modifications));
assertEquals("Unexpected number of midifications", 1, modifications.size());
PrismAsserts.assertPropertyReplace(
modifications,
new ItemPath(
new NameItemPathSegment(UserType.F_ASSIGNMENT),
new IdItemPathSegment(1L),
new NameItemPathSegment(AssignmentType.F_DESCRIPTION)),
"chamalalia patlama paprtala");
ItemDelta.checkConsistence(modifications);
}
@Test
public void testContainerValueDiffDesciptionNoPath() throws Exception {
System.out.println("\n\n===[ testContainerValueDiffDesciptionNoPath ]===\n");
// GIVEN
PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
PrismContainerDefinition<AssignmentType> assignmentContDef = userDef.findContainerDefinition(UserType.F_ASSIGNMENT);
PrismContainer<AssignmentType> ass1 = assignmentContDef.instantiate();
PrismContainerValue<AssignmentType> ass1cval = ass1.createNewValue();
ass1cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah", PrismTestUtil.getPrismContext());
PrismContainer<AssignmentType> ass2 = assignmentContDef.instantiate();
PrismContainerValue<AssignmentType> ass2cval = ass2.createNewValue();
ass2cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "chamalalia patlama paprtala", PrismTestUtil.getPrismContext());
// WHEN
Collection<? extends ItemDelta> modifications = ass1cval.diff(ass2cval);
// THEN
assertNotNull(modifications);
System.out.println(DebugUtil.debugDump(modifications));
assertEquals("Unexpected number of midifications", 1, modifications.size());
PrismAsserts.assertPropertyReplace(
modifications,
new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_DESCRIPTION),
"chamalalia patlama paprtala");
ItemDelta.checkConsistence(modifications);
}
// @Test
// public void testContainerValueDiffDesciptionPath() throws Exception {
// System.out.println("\n\n===[ testContainerValueDiffDesciptionPath ]===\n");
//
// // GIVEN
// PrismObjectDefinition<UserType> userDef = getUserTypeDefinition();
// PrismContainerDefinition<AssignmentType> assignmentContDef = userDef.findContainerDefinition(UserType.F_ASSIGNMENT);
//
// PrismContainer<AssignmentType> ass1 = assignmentContDef.instantiate();
// PrismContainerValue<AssignmentType> ass1cval = ass1.createNewValue();
// ass1cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah");
//
// PrismContainer<AssignmentType> ass2 = assignmentContDef.instantiate();
// PrismContainerValue<AssignmentType> ass2cval = ass2.createNewValue();
// ass2cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "chamalalia patlama paprtala");
//
// ItemPath pathPrefix = new ItemPath(
// new NameItemPathSegment(UserType.F_ASSIGNMENT),
// new IdItemPathSegment("1"));
//
// // WHEN
// Collection<? extends ItemDelta> modifications = ass1cval.diff(ass2cval, pathPrefix, true, false);
//
// // THEN
// assertNotNull(modifications);
// System.out.println(DebugUtil.debugDump(modifications));
// assertEquals("Unexpected number of midifications", 1, modifications.size());
// PrismAsserts.assertPropertyReplace(
// modifications,
// new ItemPath(
// new NameItemPathSegment(UserType.F_ASSIGNMENT),
// new IdItemPathSegment("1"),
// new NameItemPathSegment(AssignmentType.F_DESCRIPTION)),
// "chamalalia patlama paprtala");
// ItemDelta.checkConsistence(modifications);
// }
}