From b747d642888ee6f1c518bc2c5fa8879faea04af3 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Fri, 1 Dec 2017 14:35:27 +0100 Subject: [PATCH 1/3] Tests for old values in audit deltas (MID-4020) --- .../intest/TestModelServiceContract.java | 112 ++++++++++++++---- .../midpoint/test/DummyAuditService.java | 48 +++++++- 2 files changed, 132 insertions(+), 28 deletions(-) diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java index 3b642173099..295769e3579 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java @@ -2528,8 +2528,8 @@ public void test191ModifyUserJackModifyAssignment() throws Exception { } @Test - public void test195ModifyUserJack() throws Exception { - final String TEST_NAME = "test195ModifyUserJack"; + public void test192ModifyUserJack() throws Exception { + final String TEST_NAME = "test192ModifyUserJack"; displayTestTitle(TEST_NAME); // GIVEN @@ -2544,15 +2544,14 @@ public void test195ModifyUserJack() throws Exception { // THEN displayThen(TEST_NAME); - result.computeStatus(); - TestUtil.assertSuccess("executeChanges result", result); + assertSuccess(result); // Strong mappings assertCounterIncrement(InternalCounters.SHADOW_FETCH_OPERATION_COUNT, 1); - PrismObject userJack = getUser(USER_JACK_OID); - display("User after change execution", userJack); - assertUserJack(userJack, "Magnificent Captain Jack Sparrow"); - accountJackOid = getSingleLinkOid(userJack); + PrismObject userAfter = getUser(USER_JACK_OID); + display("User after", userAfter); + assertUserJack(userAfter, "Magnificent Captain Jack Sparrow"); + accountJackOid = getSingleLinkOid(userAfter); // Check shadow PrismObject accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); @@ -2565,7 +2564,7 @@ public void test195ModifyUserJack() throws Exception { // Check account in dummy resource assertDefaultDummyAccount("jack", "Magnificent Captain Jack Sparrow", true); - assertDummyScriptsModify(userJack); + assertDummyScriptsModify(userAfter); // Check audit display("Audit", dummyAuditService); @@ -2601,8 +2600,8 @@ public void test195ModifyUserJack() throws Exception { } @Test - public void test196ModifyUserJackLocationEmpty() throws Exception { - final String TEST_NAME = "test196ModifyUserJackLocationEmpty"; + public void test193ModifyUserJackLocationEmpty() throws Exception { + final String TEST_NAME = "test193ModifyUserJackLocationEmpty"; displayTestTitle(TEST_NAME); // GIVEN @@ -2611,18 +2610,17 @@ public void test196ModifyUserJackLocationEmpty() throws Exception { preTestCleanup(AssignmentPolicyEnforcementType.FULL); // WHEN - modifyUserReplace(USER_JACK_OID, UserType.F_LOCALITY, task, result); + modifyUserReplace(USER_JACK_OID, UserType.F_LOCALITY, task, result /* no value */); // THEN - result.computeStatus(); - TestUtil.assertSuccess("executeChanges result", result); + assertSuccess(result); // Strong mappings assertCounterIncrement(InternalCounters.SHADOW_FETCH_OPERATION_COUNT, 1); - PrismObject userJack = getUser(USER_JACK_OID); - display("User after change execution", userJack); - assertUserJack(userJack, "Magnificent Captain Jack Sparrow", "Jack", "Sparrow", null); - accountJackOid = getSingleLinkOid(userJack); + PrismObject userAfter = getUser(USER_JACK_OID); + display("User after", userAfter); + assertUserJack(userAfter, "Magnificent Captain Jack Sparrow", "Jack", "Sparrow", null); + accountJackOid = getSingleLinkOid(userAfter); // Check shadow PrismObject accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); @@ -2636,7 +2634,7 @@ public void test196ModifyUserJackLocationEmpty() throws Exception { // Check account in dummy resource assertDefaultDummyAccount("jack", "Magnificent Captain Jack Sparrow", true); - assertDummyScriptsModify(userJack); + assertDummyScriptsModify(userAfter); // Check audit display("Audit", dummyAuditService); @@ -2645,6 +2643,9 @@ public void test196ModifyUserJackLocationEmpty() throws Exception { dummyAuditService.assertAnyRequestDeltas(); dummyAuditService.assertExecutionDeltas(2); dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); + dummyAuditService.assertPropertyReplace(ChangeType.MODIFY, UserType.class, UserType.F_LOCALITY /* no values */); + // MID-4020 + dummyAuditService.assertOldValue(ChangeType.MODIFY, UserType.class, UserType.F_LOCALITY, createPolyString(USER_JACK_LOCALITY)); dummyAuditService.assertHasDelta(ChangeType.MODIFY, ShadowType.class); dummyAuditService.assertTarget(USER_JACK_OID); dummyAuditService.assertExecutionSuccess(); @@ -2665,8 +2666,8 @@ public void test196ModifyUserJackLocationEmpty() throws Exception { } @Test - public void test197ModifyUserJackLocationNull() throws Exception { - final String TEST_NAME = "test197ModifyUserJackLocationNull"; + public void test194ModifyUserJackLocationNull() throws Exception { + final String TEST_NAME = "test194ModifyUserJackLocationNull"; displayTestTitle(TEST_NAME); // GIVEN @@ -2697,6 +2698,73 @@ public void test197ModifyUserJackLocationNull() throws Exception { assertCounterIncrement(InternalCounters.SCRIPT_COMPILE_COUNT, 0); assertSteadyResources(); } + + @Test + public void test195ModifyUserJackLocationSea() throws Exception { + final String TEST_NAME = "test195ModifyUserJackLocationSea"; + displayTestTitle(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + preTestCleanup(AssignmentPolicyEnforcementType.FULL); + + // WHEN + displayWhen(TEST_NAME); + modifyUserReplace(USER_JACK_OID, UserType.F_LOCALITY, task, result, createPolyString("sea")); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + // Strong mappings + assertCounterIncrement(InternalCounters.SHADOW_FETCH_OPERATION_COUNT, 1); + + PrismObject userAfter = getUser(USER_JACK_OID); + display("User after", userAfter); + assertUserJack(userAfter, "Magnificent Captain Jack Sparrow", USER_JACK_GIVEN_NAME, USER_JACK_FAMILY_NAME, "sea"); + accountJackOid = getSingleLinkOid(userAfter); + + // Check shadow + PrismObject accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); + assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); + + // Check account + PrismObject accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); + assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Magnificent Captain Jack Sparrow"); + + // Check account in dummy resource + assertDefaultDummyAccount("jack", "Magnificent Captain Jack Sparrow", true); + + assertDummyScriptsModify(userAfter); + + // Check audit + display("Audit", dummyAuditService); + dummyAuditService.assertRecords(2); + dummyAuditService.assertSimpleRecordSanity(); + dummyAuditService.assertAnyRequestDeltas(); + dummyAuditService.assertExecutionDeltas(2); + dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); + dummyAuditService.assertHasDelta(ChangeType.MODIFY, ShadowType.class); + dummyAuditService.assertPropertyReplace(ChangeType.MODIFY, UserType.class, UserType.F_LOCALITY, createPolyString("sea")); + // MID-4020 + dummyAuditService.assertOldValue(ChangeType.MODIFY, UserType.class, UserType.F_LOCALITY /* no values */); + dummyAuditService.assertTarget(USER_JACK_OID); + dummyAuditService.assertExecutionSuccess(); + + // Check notifications + notificationManager.setDisabled(true); + checkDummyTransportMessages(NOTIFIER_ACCOUNT_PASSWORD_NAME, 0); + checkDummyTransportMessages("userPasswordNotifier", 0); + checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); + checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); + checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); + checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); + checkDummyTransportMessages("simpleUserNotifier", 1); + checkDummyTransportMessages("simpleUserNotifier-ADD", 0); + + assertCounterIncrement(InternalCounters.SCRIPT_COMPILE_COUNT, 0); + assertSteadyResources(); + } @Test public void test198ModifyUserJackRaw() throws Exception { @@ -2721,7 +2789,7 @@ public void test198ModifyUserJackRaw() throws Exception { PrismObject userJack = getUser(USER_JACK_OID); display("User after change execution", userJack); - assertUserJack(userJack, "Marvelous Captain Jack Sparrow", "Jack", "Sparrow", null); + assertUserJack(userJack, "Marvelous Captain Jack Sparrow", "Jack", "Sparrow", "sea"); accountJackOid = getSingleLinkOid(userJack); // Check shadow diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/DummyAuditService.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/DummyAuditService.java index 11940ded463..d5fadaf79f5 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/DummyAuditService.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/DummyAuditService.java @@ -344,17 +344,46 @@ public void assertTarget(String expectedOid) { assertTarget(expectedOid, AuditEventStage.REQUEST); assertTarget(expectedOid, AuditEventStage.EXECUTION); } + + public void assertPropertyReplace(ChangeType expectedChangeType, Class expectedClass, QName attrName, T... expectedValues) { + assertPropertyReplace(null, 0, expectedChangeType, expectedClass, new ItemPath(attrName), expectedValues); + } + + public void assertPropertyReplace(ChangeType expectedChangeType, Class expectedClass, ItemPath propPath, T... expectedValues) { + assertPropertyReplace(null, 0, expectedChangeType, expectedClass, propPath, expectedValues); + } - public void assertOldValue(ChangeType expectedChangeType, Class expectedClass, QName attrName, T expectedValue) { - assertOldValue(null, 0, expectedChangeType, expectedClass, new ItemPath(attrName), expectedValue); + public void assertPropertyReplace(int index, ChangeType expectedChangeType, Class expectedClass, ItemPath propPath, T... expectedValues) { + assertPropertyReplace(null, index, expectedChangeType, expectedClass, propPath, expectedValues); + } + + public void assertPropertyReplace(String message, int index, ChangeType expectedChangeType, Class expectedClass, ItemPath propPath, T... expectedValues) { + ObjectDeltaOperation deltaOp = getExecutionDelta(index, expectedChangeType, expectedClass); + assert deltaOp != null : (message==null?"":message+": ")+"Delta for "+expectedClass+" of type "+expectedChangeType+" was not found in audit trail"; + PropertyDelta propDelta = deltaOp.getObjectDelta().findPropertyDelta(propPath); + assert propDelta != null : "No property delta for "+propPath+" in Delta for "+expectedClass+" of type "+expectedChangeType; + Collection> valuesToReplace = propDelta.getValuesToReplace(); + assert valuesToReplace != null : "No values to replace in property delta for "+propPath+" in Delta for "+expectedClass+" of type "+expectedChangeType; + if (expectedValues == null || expectedValues.length == 0) { + if (valuesToReplace.isEmpty()) { + return; + } else { + assert false : (message==null?"":message+": ") + "Empty values to replace in property delta for "+propPath+" in Delta for "+expectedClass+" of type "+expectedChangeType + ", expected " + Arrays.toString(expectedValues); + } + } + PrismAsserts.assertValues((message==null?"":message+": ") +"Wrong values to replace in property delta for "+propPath+" in Delta for "+expectedClass+" of type "+expectedChangeType, valuesToReplace, expectedValues); + } + + public void assertOldValue(ChangeType expectedChangeType, Class expectedClass, QName attrName, T... expectedValues) { + assertOldValue(null, 0, expectedChangeType, expectedClass, new ItemPath(attrName), expectedValues); } - public void assertOldValue(ChangeType expectedChangeType, Class expectedClass, ItemPath propPath, T expectedValue) { - assertOldValue(null, 0, expectedChangeType, expectedClass, propPath, expectedValue); + public void assertOldValue(ChangeType expectedChangeType, Class expectedClass, ItemPath propPath, T... expectedValues) { + assertOldValue(null, 0, expectedChangeType, expectedClass, propPath, expectedValues); } - public void assertOldValue(int index, ChangeType expectedChangeType, Class expectedClass, ItemPath propPath, T expectedValue) { - assertOldValue(null, index, expectedChangeType, expectedClass, propPath, expectedValue); + public void assertOldValue(int index, ChangeType expectedChangeType, Class expectedClass, ItemPath propPath, T... expectedValues) { + assertOldValue(null, index, expectedChangeType, expectedClass, propPath, expectedValues); } public void assertOldValue(String message, int index, ChangeType expectedChangeType, Class expectedClass, ItemPath propPath, T... expectedValues) { @@ -363,6 +392,13 @@ public void assertOldValue(String message, int index, C PropertyDelta propDelta = deltaOp.getObjectDelta().findPropertyDelta(propPath); assert propDelta != null : "No property delta for "+propPath+" in Delta for "+expectedClass+" of type "+expectedChangeType; Collection> estimatedOldValues = propDelta.getEstimatedOldValues(); + if (expectedValues == null || expectedValues.length == 0) { + if (estimatedOldValues == null || estimatedOldValues.isEmpty()) { + return; + } else { + assert false : (message==null?"":message+": ") + "Empty old values in property delta for "+propPath+" in Delta for "+expectedClass+" of type "+expectedChangeType + ", expected " + Arrays.toString(expectedValues); + } + } assert estimatedOldValues != null && !estimatedOldValues.isEmpty() : "No old values in property delta for "+propPath+" in Delta for "+expectedClass+" of type "+expectedChangeType; PrismAsserts.assertValues((message==null?"":message+": ") +"Wrong old values in property delta for "+propPath+" in Delta for "+expectedClass+" of type "+expectedChangeType, estimatedOldValues, expectedValues); } From e824b2cd6cf4fc13994cc67ab453d564b3575096 Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Fri, 1 Dec 2017 15:19:32 +0100 Subject: [PATCH 2/3] MID-4182 localization key resolving fix --- .../midpoint/common/LocalizationServiceImpl.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/LocalizationServiceImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/LocalizationServiceImpl.java index 7f94d6d236f..66e2b753285 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/LocalizationServiceImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/LocalizationServiceImpl.java @@ -19,6 +19,8 @@ import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; import org.apache.commons.lang.StringUtils; import org.springframework.context.MessageSource; import org.springframework.context.NoSuchMessageException; @@ -38,6 +40,8 @@ */ public class LocalizationServiceImpl implements LocalizationService { + private static final Trace LOG = TraceManager.getTrace(LocalizationServiceImpl.class); + private List sources = new ArrayList<>(); public void init() { @@ -73,7 +77,10 @@ public String translate(String key, Object[] params, Locale locale, String defau try { String value = source.getMessage(key, translated, locale); if (StringUtils.isNotEmpty(value)) { - //System.out.println("LSI: resolved [" + key + "] into [" + value + "]"); + if (LOG.isTraceEnabled()) { + LOG.trace("Resolved key {} to value {} using message source {}", new Object[]{key, value, source}); + } + return value; } } catch (NoSuchMessageException ex) { @@ -105,6 +112,7 @@ public String translate(LocalizableMessage msg, Locale locale) { private ResourceBundleMessageSource buildSource(String basename, ClassLoader classLoader) { ResourceBundleMessageSource source = new ResourceBundleMessageSource(); source.setDefaultEncoding(StandardCharsets.UTF_8.name()); + source.setFallbackToSystemLocale(false); source.setBasename(basename); if (classLoader == null) { From b276dc1a9a0951e588296a15b9646785434de3ba Mon Sep 17 00:00:00 2001 From: kate Date: Sat, 2 Dec 2017 00:19:40 +0100 Subject: [PATCH 3/3] operation result localization --- .../users/component/AbstractRoleMemberPanel.java | 13 +++++++------ .../main/resources/localization/Midpoint.properties | 13 ++++++++++++- .../resources/localization/Midpoint_en.properties | 12 ++++++++++++ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java index 7076afe3f06..33102a4b87f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java @@ -555,18 +555,19 @@ public IModel getDataModel(IModel> rowModel) protected String getTaskName(String operation, QueryScope scope, boolean managers) { StringBuilder nameBuilder = new StringBuilder(operation); - nameBuilder.append(" "); + nameBuilder.append("."); if (scope != null) { nameBuilder.append(scope.name()); - nameBuilder.append(" "); + nameBuilder.append("."); } if (managers) { - nameBuilder.append("managers: "); + nameBuilder.append("managers"); } else { - nameBuilder.append("members: "); + nameBuilder.append("members"); } - nameBuilder - .append(WebComponentUtil.getEffectiveName(getModelObject(), AbstractRoleType.F_DISPLAY_NAME)); +// nameBuilder.append("."); +// nameBuilder +// .append(WebComponentUtil.getEffectiveName(getModelObject(), AbstractRoleType.F_DISPLAY_NAME)); return nameBuilder.toString(); } diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index 220647228b9..8b5ec04e42a 100755 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -3861,4 +3861,15 @@ ExpressionValuePanel.addValueButtonDefaultTitle=Add shadow reference value ExpressionValuePanel.addValueButtonTargetSearchTitle=Add association target search ExpressionValuePanel.addLiteralValueButton=Add literal value ConstructionType.attribute=Attribute -ConstructionType.association=Association \ No newline at end of file +ConstructionType.association=Association +operation.Recompute.ALL.members=Recompute all members +operation.Recompute.SELECTED.members=Recompute selected members +operation.Recompute.ALL_DIRECT.members=Recompute all direct members +operation.Remove.ALL.members=Remove all members +operation.Remove.SELECTED.members=Remove selected members +operation.Remove.ALL_DIRECT.members=Remove all direct members +operation.Remove.ALL.managers=Remove all managers +operation.Remove.SELECTED.managers=Remove selected managers +operation.Remove.ALL_DIRECT.managers=Remove all direct managers +operation.Add.members=Add members +operation.Remove.members=Remove members diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties index 3f626546079..6b4a625b7d7 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties @@ -3819,3 +3819,15 @@ ExpressionValuePanel.addValueButtonDefaultTitle=Add shadow reference value ExpressionValuePanel.addValueButtonTargetSearchTitle=Add association target search ConstructionType.attribute=Attribute ConstructionType.association=Association +operation.Recompute.ALL.members=Recompute all members +operation.Recompute.SELECTED.members=Recompute selected members +operation.Recompute.ALL_DIRECT.members=Recompute all direct members +operation.Remove.ALL.members=Remove all members +operation.Remove.SELECTED.members=Remove selected members +operation.Remove.ALL_DIRECT.members=Remove all direct members +operation.Remove.ALL.managers=Remove all managers +operation.Remove.SELECTED.managers=Remove selected managers +operation.Remove.ALL_DIRECT.managers=Remove all direct managers +operation.Add.members=Add members +operation.Remove.members=Remove members +