/** * Extends offset on top of existing offset. */ public void overrideDuration(String durationString) { overrideDuration(XmlTypeConverter.createDuration(durationString)); }
protected void clockForward(String duration) { XMLGregorianCalendar before = clock.currentTimeXMLGregorianCalendar(); clock.overrideDuration(duration); XMLGregorianCalendar after = clock.currentTimeXMLGregorianCalendar(); display("Clock going forward", before + " --[" + duration + "]--> " + after); }
/** * Extends offset on top of existing offset. */ public void overrideDuration(Duration duration) { long millis = currentTimeMillis(); XMLGregorianCalendar time = XmlTypeConverter.createXMLGregorianCalendar(millis); time.add(duration); long offset = XmlTypeConverter.toMillis(time) - millis; overrideDuration(offset); }
@Test public void test156PasswordLoginNotValidAnyLongerGoodPassword() throws Exception { final String TEST_NAME = "test156PasswordLoginNotValidAnyLongerGoodPassword"; TestUtil.displayTestTitle(TEST_NAME); // GIVEN clock.overrideDuration("P2D"); Task task = createTask(TestAbstractAuthenticationEvaluator.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); loginJackGoodPasswordExpectDenied(TEST_NAME, task, result); }
@Test public void test155PasswordLoginValidGoodPassword() throws Exception { final String TEST_NAME = "test155PasswordLoginValidGoodPassword"; TestUtil.displayTestTitle(TEST_NAME); // GIVEN clock.overrideDuration("PT2H"); Task task = createTask(TestAbstractAuthenticationEvaluator.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); loginJackGoodPasswordExpectSuccess(TEST_NAME, task, result); }
@Test public void test410ManualReiterationUnavailable() throws Exception { final String TEST_NAME = "test410ManualReiterationUnavailable"; TestUtil.displayTestTitle(this, TEST_NAME); login(getUserFromRepo(USER_ADMINISTRATOR_OID)); // GIVEN Task task = taskManager.createTaskInstance(TestEscalation.class.getName() + "." + TEST_NAME); task.setOwner(userAdministrator.asPrismObject()); OperationResult result = task.getResult(); dummyTransport.clearMessages(); // WHEN TestUtil.displayWhen(TEST_NAME); clock.resetOverride(); clock.overrideDuration("P22D"); // +1 day relative to previous test try { certificationManager.reiterateCampaign(campaignOid, task, result); fail("unexpected success"); } catch (IllegalStateException e) { // THEN System.err.println("got expected exception: " + e.getMessage()); e.printStackTrace(); assertTrue("wrong exception message", e.getMessage().contains("maximum number of iterations (3) was reached")); } }
@Test public void test130Remediation() throws Exception { final String TEST_NAME = "test130Remediation"; TestUtil.displayTestTitle(this, TEST_NAME); login(getUserFromRepo(USER_ADMINISTRATOR_OID)); // GIVEN Task task = taskManager.createTaskInstance(TestEscalation.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); dummyTransport.clearMessages(); // WHEN TestUtil.displayWhen(TEST_NAME); clock.resetOverride(); clock.overrideDuration("P15D"); // stage ends at P14D waitForTaskNextRun(TASK_TRIGGER_SCANNER_OID, true, 20000, true); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); AccessCertificationCampaignType campaign = getCampaignWithCases(campaignOid); display("campaign after remediation", campaign); assertStateAndStage(campaign, AccessCertificationCampaignStateType.IN_REMEDIATION, 2); }
@Test public void test300Close() throws Exception { final String TEST_NAME = "test300Close"; TestUtil.displayTestTitle(this, TEST_NAME); login(getUserFromRepo(USER_ADMINISTRATOR_OID)); // GIVEN Task task = taskManager.createTaskInstance(TestEscalation.class.getName() + "." + TEST_NAME); task.setOwner(userAdministrator.asPrismObject()); OperationResult result = task.getResult(); dummyTransport.clearMessages(); // WHEN TestUtil.displayWhen(TEST_NAME); clock.resetOverride(); clock.overrideDuration("P19D"); // +1 day relative to previous test certificationManager.closeCampaign(campaignOid, true, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); AccessCertificationCampaignType campaign = getCampaignWithCases(campaignOid); display("campaign after close", campaign); assertStateAndStage(campaign, AccessCertificationCampaignStateType.CLOSED, 2); assertEquals("Wrong # of triggers", 0, campaign.getTrigger().size()); // no more automated reiterations }
@Test public void test130Complete() throws Exception { final String TEST_NAME = "test130Complete"; TestUtil.displayTestTitle(this, TEST_NAME); login(userAdministrator); Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); clock.resetOverride(); clock.overrideDuration("P15D"); // at 0 (i.e. P14D) there is a delegate action waitForTaskNextRun(TASK_TRIGGER_SCANNER_OID, true, 20000, true); PrismObject<TaskType> wfTask = getTask(approvalTaskOid); display("task", wfTask); assertEquals("Wrong # of triggers", 0, wfTask.asObjectable().getTrigger().size()); Task rootTask = taskManager.getTaskByIdentifier(wfTask.asObjectable().getParent(), result); display("rootTask", rootTask); waitForTaskClose(rootTask, 60000); assertAssignedRole(userJackOid, roleE1Oid, task, result); }
@Test public void test140Close() throws Exception { final String TEST_NAME = "test140Close"; TestUtil.displayTestTitle(this, TEST_NAME); login(getUserFromRepo(USER_ADMINISTRATOR_OID)); // GIVEN Task task = taskManager.createTaskInstance(TestEscalation.class.getName() + "." + TEST_NAME); task.setOwner(userAdministrator.asPrismObject()); OperationResult result = task.getResult(); dummyTransport.clearMessages(); // WHEN TestUtil.displayWhen(TEST_NAME); clock.resetOverride(); clock.overrideDuration("P16D"); certificationManager.closeCampaign(campaignOid, true, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); AccessCertificationCampaignType campaign = getCampaignWithCases(campaignOid); display("campaign after close", campaign); assertStateAndStage(campaign, AccessCertificationCampaignStateType.CLOSED, 2); assertEquals("Wrong # of triggers", 1, campaign.getTrigger().size()); // reiterate }
@Test public void test400Close() throws Exception { final String TEST_NAME = "test300Close"; TestUtil.displayTestTitle(this, TEST_NAME); login(getUserFromRepo(USER_ADMINISTRATOR_OID)); // GIVEN Task task = taskManager.createTaskInstance(TestEscalation.class.getName() + "." + TEST_NAME); task.setOwner(userAdministrator.asPrismObject()); OperationResult result = task.getResult(); dummyTransport.clearMessages(); // WHEN TestUtil.displayWhen(TEST_NAME); clock.resetOverride(); clock.overrideDuration("P21D"); // +1 day relative to previous test certificationManager.closeCampaign(campaignOid, true, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); AccessCertificationCampaignType campaign = getCampaignWithCases(campaignOid); display("campaign after close", campaign); assertStateAndStage(campaign, AccessCertificationCampaignStateType.CLOSED, 2); assertEquals("Wrong # of triggers", 0, campaign.getTrigger().size()); // no more automated reiterations }
/** * MID-4002 */ @Test public void test717RecomputeJackAfter130min() throws Exception { final String TEST_NAME = "test717RecomputeJackAfter130min"; displayTestTitle(TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); clock.overrideDuration("PT130M"); // WHEN displayWhen(TEST_NAME); // We need reconcile and not recompute here. We need to fetch the updated case status. reconcileUser(USER_JACK_OID, task, result); // THEN displayThen(TEST_NAME); display("result", result); assertSuccess(result); UserAsserter<Void> userAfterAsserter = assertUserAfter(USER_JACK_OID); userAfterAsserter.displayWithProjections(); assertDeprovisionedTimedOutUser(userAfterAsserter, accountJackOid); assertCase(jackLastCaseOid, SchemaConstants.CASE_STATE_CLOSED); }
@Test public void test210Escalate() throws Exception { final String TEST_NAME = "test210Escalate"; TestUtil.displayTestTitle(this, TEST_NAME); login(userAdministrator); Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); dummyAuditService.clear(); dummyTransport.clearMessages(); // WHEN clock.overrideDuration("P3DT10M"); // at 3D there's a deadline with escalation waitForTaskNextRun(TASK_TRIGGER_SCANNER_OID, true, 20000, true); // THEN SearchResultList<WorkItemType> workItems = getWorkItems(task, result); displayWorkItems("Work items after deadline", workItems); PrismObject<TaskType> wfTask = getTask(approvalTaskOid); display("workflow task", wfTask); // D-0 days: reject (twice) assertEquals("Wrong # of triggers", 2, wfTask.asObjectable().getTrigger().size()); displayCollection("audit records", dummyAuditService.getRecords()); display("dummy transport", dummyTransport); }
@Test public void test110Notify() throws Exception { final String TEST_NAME = "test110Notify"; TestUtil.displayTestTitle(this, TEST_NAME); login(userAdministrator); Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); clock.overrideDuration("P6D"); // at P5D there's a notify action waitForTaskNextRun(TASK_TRIGGER_SCANNER_OID, true, 20000, true); // TODO assert notifications WorkItemType workItem = getWorkItem(task, result); display("work item", workItem); String wfTaskOid = WfContextUtil.getTask(workItem).getOid(); PrismObject<TaskType> wfTask = getTask(wfTaskOid); display("task", wfTask); assertEquals("Wrong # of triggers", 2, wfTask.asObjectable().getTrigger().size()); PrismAsserts.assertReferenceValues(ref(workItem.getAssigneeRef()), userLead1Oid); PrismAsserts.assertReferenceValue(ref(workItem.getOriginalAssigneeRef()), userLead1Oid); }
@Test public void test209UserGuybrushPasswordLoginGoodPasswordBeforeExpiration() throws Exception { final String TEST_NAME = "test209UserGuybrushPasswordLoginGoodPasswordBeforeExpiration"; TestUtil.displayTestTitle(TEST_NAME); // GIVEN clock.overrideDuration("P29D"); ConnectionEnvironment connEnv = createConnectionEnvironment(); XMLGregorianCalendar startTs = clock.currentTimeXMLGregorianCalendar(); // WHEN TestUtil.displayWhen(TEST_NAME); Authentication authentication = getAuthenticationEvaluator().authenticate(connEnv, getAuthenticationContext(USER_GUYBRUSH_USERNAME, getGoodPasswordGuybrush())); // THEN TestUtil.displayThen(TEST_NAME); XMLGregorianCalendar endTs = clock.currentTimeXMLGregorianCalendar(); assertGoodPasswordAuthentication(authentication, USER_GUYBRUSH_USERNAME); PrismObject<UserType> userAfter = getUser(USER_GUYBRUSH_OID); display("user after", userAfter); assertFailedLogins(userAfter, 0); assertLastSuccessfulLogin(userAfter, startTs, endTs); }
@Test public void test135PasswordLoginLockedoutLockExpires() throws Exception { final String TEST_NAME = "test135PasswordLoginLockedoutLockExpires"; TestUtil.displayTestTitle(TEST_NAME); // GIVEN clock.overrideDuration("PT30M"); ConnectionEnvironment connEnv = createConnectionEnvironment(); XMLGregorianCalendar startTs = clock.currentTimeXMLGregorianCalendar(); // WHEN TestUtil.displayWhen(TEST_NAME); Authentication authentication = getAuthenticationEvaluator().authenticate(connEnv, getAuthenticationContext(USER_JACK_USERNAME, getGoodPasswordJack())); // THEN TestUtil.displayThen(TEST_NAME); XMLGregorianCalendar endTs = clock.currentTimeXMLGregorianCalendar(); assertGoodPasswordAuthentication(authentication, USER_JACK_USERNAME); PrismObject<UserType> userAfter = getUser(USER_JACK_OID); display("user after", userAfter); assertFailedLogins(userAfter, 0); assertLastSuccessfulLogin(userAfter, startTs, endTs); assertUserLockout(userAfter, LockoutStatusType.NORMAL); }
@Test public void test906ModifyUserElainePasswordLater() throws Exception { final String TEST_NAME = "test906ModifyUserElainePasswordLater"; displayTestTitle(TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); prepareTest(); clock.overrideDuration("PT15M"); lastPasswordChangeStart = clock.currentTimeXMLGregorianCalendar(); // WHEN modifyUserChangePassword(USER_ELAINE_OID, USER_PASSWORD_VALID_3, task, result); // THEN assertSuccess(result); lastPasswordChangeEnd = clock.currentTimeXMLGregorianCalendar(); PrismObject<UserType> userAfter = getUser(USER_ELAINE_OID); display("User after", userAfter); assertUserPassword(userAfter, USER_PASSWORD_VALID_3); displayAccountPasswordNotifications(); assertAccountPasswordNotifications(2); assertHasAccountPasswordNotification(null, USER_ELAINE_USERNAME, USER_PASSWORD_VALID_3); assertHasAccountPasswordNotification(RESOURCE_DUMMY_RED_NAME, USER_ELAINE_USERNAME, USER_PASSWORD_VALID_3); // BLUE resource already has a password assertSingleUserPasswordNotification(USER_ELAINE_USERNAME, USER_PASSWORD_VALID_3); }
@Test public void test210UserGuybrushPasswordLoginGoodPasswordExpired() throws Exception { final String TEST_NAME = "test210UserGuybrushPasswordLoginGoodPasswordExpired"; TestUtil.displayTestTitle(TEST_NAME); // GIVEN clock.overrideDuration("P2D"); ConnectionEnvironment connEnv = createConnectionEnvironment(); XMLGregorianCalendar startTs = clock.currentTimeXMLGregorianCalendar(); try { // WHEN TestUtil.displayWhen(TEST_NAME); getAuthenticationEvaluator().authenticate(connEnv, getAuthenticationContext(USER_GUYBRUSH_USERNAME, getGoodPasswordGuybrush())); AssertJUnit.fail("Unexpected success"); } catch (CredentialsExpiredException e) { // This is expected // THEN TestUtil.displayThen(TEST_NAME); display("expected exception", e); assertExpiredException(e, USER_GUYBRUSH_USERNAME); } XMLGregorianCalendar endTs = clock.currentTimeXMLGregorianCalendar(); PrismObject<UserType> userAfter = getUser(USER_GUYBRUSH_OID); display("user after", userAfter); assertFailedLogins(userAfter, 0); }
@Test public void test120Escalate() throws Exception { final String TEST_NAME = "test120Escalate"; TestUtil.displayTestTitle(this, TEST_NAME); login(userAdministrator); Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); clock.resetOverride(); clock.overrideDuration("P13D"); // at -P2D (i.e. P12D) there is a delegate action waitForTaskNextRun(TASK_TRIGGER_SCANNER_OID, true, 20000, true); WorkItemType workItem = getWorkItem(task, result); display("work item", workItem); PrismObject<TaskType> wfTask = getTask(WfContextUtil.getTask(workItem).getOid()); display("task", wfTask); assertEquals("Wrong # of triggers", 1, wfTask.asObjectable().getTrigger().size()); PrismAsserts.assertReferenceValues(ref(workItem.getAssigneeRef()), userLead1Oid, userLead2Oid); PrismAsserts.assertReferenceValue(ref(workItem.getOriginalAssigneeRef()), userLead1Oid); assertEquals("Wrong escalation level number", 1, WfContextUtil.getEscalationLevelNumber(workItem)); }
@Test public void test640JackRoleSwashbucklerBecomesValid() throws Exception { final String TEST_NAME = "test640JackRoleSwashbucklerBecomesValid"; displayTestTitle(TEST_NAME); Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); clock.overrideDuration("PT2H"); // WHEN recomputeUser(USER_JACK_OID, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> user = getUser(USER_JACK_OID); display("User jack", user); assertDefaultDummyAccount(ACCOUNT_JACK_DUMMY_USERNAME, ACCOUNT_JACK_DUMMY_FULLNAME, true); DummyGroup dummyGroup = getDummyResource().getGroupByName(GROUP_DUMMY_SWASHBUCKLERS_NAME); assertNotNull("No group on dummy resource", dummyGroup); display("Group", dummyGroup); assertEquals("Wrong group description", GROUP_DUMMY_SWASHBUCKLERS_DESCRIPTION, dummyGroup.getAttributeValue(DummyResourceContoller.DUMMY_GROUP_ATTRIBUTE_DESCRIPTION)); assertGroupMember(dummyGroup, ACCOUNT_JACK_DUMMY_USERNAME); assertDummyAccountAttribute(null, ACCOUNT_JACK_DUMMY_USERNAME, DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_DRINK_NAME, RESOURCE_DUMMY_DRINK, "grog"); assertDummyAccountAttribute(null, ACCOUNT_JACK_DUMMY_USERNAME, DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_TITLE_NAME, "Bloody Pirate", "Swashbuckler"); }