/* * Copyright (c) 2013 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.intest; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertNotNull; import javax.xml.datatype.XMLGregorianCalendar; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.Test; import com.evolveum.midpoint.model.impl.trigger.TriggerHandlerRegistry; import com.evolveum.midpoint.model.intest.AbstractInitializedModelIntegrationTest; import com.evolveum.midpoint.model.intest.util.MockTriggerHandler; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; /** * @author Radovan Semancik * * PMed: In theory, the assertions counting # of invocations could fail even if trigger task handler works well * - if the scanner task would run more than once. If that occurs in reality, we'll deal with it. * */ @ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestTriggerTask extends AbstractInitializedModelIntegrationTest { private static final XMLGregorianCalendar LONG_LONG_TIME_AGO = XmlTypeConverter.createXMLGregorianCalendar(1111, 1, 1, 12, 00, 00); private MockTriggerHandler testTriggerHandler; private XMLGregorianCalendar drakeValidFrom; private XMLGregorianCalendar drakeValidTo; @Autowired(required=true) private TriggerHandlerRegistry triggerHandlerRegistry; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { // TODO Auto-generated method stub super.initSystem(initTask, initResult); testTriggerHandler = new MockTriggerHandler(); triggerHandlerRegistry.register(MockTriggerHandler.HANDLER_URI, testTriggerHandler); } @Test public void test100ImportScannerTask() throws Exception { final String TEST_NAME = "test100ImportScannerTask"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestTriggerTask.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // Make sure there is an object with a trigger set to a long time ago. // That trigger should be invoked on first run. addTrigger(USER_JACK_OID, LONG_LONG_TIME_AGO, MockTriggerHandler.HANDLER_URI); XMLGregorianCalendar startCal = clock.currentTimeXMLGregorianCalendar(); /// WHEN TestUtil.displayWhen(TEST_NAME); importObjectFromFile(TASK_TRIGGER_SCANNER_FILE); waitForTaskStart(TASK_TRIGGER_SCANNER_OID, false); waitForTaskFinish(TASK_TRIGGER_SCANNER_OID, true); // THEN TestUtil.displayThen(TEST_NAME); XMLGregorianCalendar endCal = clock.currentTimeXMLGregorianCalendar(); assertLastRecomputeTimestamp(TASK_TRIGGER_SCANNER_OID, startCal, endCal); assertNotNull("Trigger was not called", testTriggerHandler.getLastObject()); assertEquals("Trigger was called incorrect number of times", 1, testTriggerHandler.getInvocationCount()); assertNoTrigger(UserType.class, USER_JACK_OID); assertLastRecomputeTimestamp(TASK_TRIGGER_SCANNER_OID, startCal, endCal); } @Test public void test105NoTrigger() throws Exception { final String TEST_NAME = "test105NoTrigger"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestTriggerTask.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); testTriggerHandler.reset(); XMLGregorianCalendar startCal = clock.currentTimeXMLGregorianCalendar(); /// WHEN TestUtil.displayWhen(TEST_NAME); waitForTaskNextRunAssertSuccess(TASK_TRIGGER_SCANNER_OID, true); // THEN TestUtil.displayThen(TEST_NAME); // THEN XMLGregorianCalendar endCal = clock.currentTimeXMLGregorianCalendar(); assertNull("Trigger was called while not expecting it", testTriggerHandler.getLastObject()); assertNoTrigger(UserType.class, USER_JACK_OID); assertLastRecomputeTimestamp(TASK_TRIGGER_SCANNER_OID, startCal, endCal); } @Test public void test110TriggerCalledAgain() throws Exception { final String TEST_NAME = "test110TriggerCalledAgain"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestTriggerTask.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); testTriggerHandler.reset(); XMLGregorianCalendar startCal = clock.currentTimeXMLGregorianCalendar(); addTrigger(USER_JACK_OID, startCal, MockTriggerHandler.HANDLER_URI); /// WHEN TestUtil.displayWhen(TEST_NAME); waitForTaskNextRunAssertSuccess(TASK_TRIGGER_SCANNER_OID, true); // THEN TestUtil.displayThen(TEST_NAME); // THEN XMLGregorianCalendar endCal = clock.currentTimeXMLGregorianCalendar(); assertNotNull("Trigger was not called", testTriggerHandler.getLastObject()); assertEquals("Trigger was called incorrect number of times", 1, testTriggerHandler.getInvocationCount()); assertNoTrigger(UserType.class, USER_JACK_OID); assertLastRecomputeTimestamp(TASK_TRIGGER_SCANNER_OID, startCal, endCal); } @Test public void test120TwoTriggers() throws Exception { final String TEST_NAME = "test120TwoTriggers"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestTriggerTask.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); testTriggerHandler.reset(); XMLGregorianCalendar startCal = clock.currentTimeXMLGregorianCalendar(); addTrigger(USER_JACK_OID, startCal, MockTriggerHandler.HANDLER_URI); XMLGregorianCalendar startCalPlus5ms = XmlTypeConverter.createXMLGregorianCalendar(startCal); startCalPlus5ms.add(XmlTypeConverter.createDuration(5L)); addTrigger(USER_JACK_OID, startCalPlus5ms, MockTriggerHandler.HANDLER_URI); /// WHEN TestUtil.displayWhen(TEST_NAME); waitForTaskNextRunAssertSuccess(TASK_TRIGGER_SCANNER_OID, true); // THEN TestUtil.displayThen(TEST_NAME); // THEN XMLGregorianCalendar endCal = clock.currentTimeXMLGregorianCalendar(); assertNotNull("Trigger was not called", testTriggerHandler.getLastObject()); // Originally here was only one execution expected. But why? There are two triggers // with different triggering times! So the handler should be really called two times. assertEquals("Trigger was called wrong number of times", 2, testTriggerHandler.getInvocationCount()); assertNoTrigger(UserType.class, USER_JACK_OID); assertLastRecomputeTimestamp(TASK_TRIGGER_SCANNER_OID, startCal, endCal); } @Test public void test150NoTriggerAgain() throws Exception { final String TEST_NAME = "test115NoTriggerAgain"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestTriggerTask.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); testTriggerHandler.reset(); XMLGregorianCalendar startCal = clock.currentTimeXMLGregorianCalendar(); /// WHEN TestUtil.displayWhen(TEST_NAME); waitForTaskNextRunAssertSuccess(TASK_TRIGGER_SCANNER_OID, true); // THEN TestUtil.displayThen(TEST_NAME); // THEN XMLGregorianCalendar endCal = clock.currentTimeXMLGregorianCalendar(); assertNull("Trigger was called while not expecting it", testTriggerHandler.getLastObject()); assertNoTrigger(UserType.class, USER_JACK_OID); assertLastRecomputeTimestamp(TASK_TRIGGER_SCANNER_OID, startCal, endCal); } @Test public void test200TwoDistantTriggers() throws Exception { final String TEST_NAME = "test130TwoDistantTriggers"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestTriggerTask.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); testTriggerHandler.reset(); XMLGregorianCalendar startCal = clock.currentTimeXMLGregorianCalendar(); addTrigger(USER_JACK_OID, startCal, MockTriggerHandler.HANDLER_URI); XMLGregorianCalendar startCalPlus5days = XmlTypeConverter.createXMLGregorianCalendar(startCal); startCalPlus5days.add(XmlTypeConverter.createDuration("P5D")); addTrigger(USER_JACK_OID, startCalPlus5days, MockTriggerHandler.HANDLER_URI); /// WHEN TestUtil.displayWhen(TEST_NAME); waitForTaskNextRunAssertSuccess(TASK_TRIGGER_SCANNER_OID, true); // THEN TestUtil.displayThen(TEST_NAME); // THEN XMLGregorianCalendar endCal = clock.currentTimeXMLGregorianCalendar(); assertNotNull("Trigger was not called", testTriggerHandler.getLastObject()); assertEquals("Trigger was called wrong number of times", 1, testTriggerHandler.getInvocationCount()); assertTrigger(getUser(USER_JACK_OID), MockTriggerHandler.HANDLER_URI, startCalPlus5days, 100L); assertLastRecomputeTimestamp(TASK_TRIGGER_SCANNER_OID, startCal, endCal); } }