/*
* Copyright (c) 2010-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.task.quartzimpl;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.repo.sql.type.XMLGregorianCalendarType;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;
import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import static com.evolveum.midpoint.test.IntegrationTestTools.display;
/**
* @author lazyman
*/
@ContextConfiguration(locations = {"classpath:ctx-task.xml",
"classpath:ctx-task-test.xml",
"classpath:ctx-repo-cache.xml",
"classpath*:ctx-repository-test.xml",
"classpath:ctx-audit.xml",
"classpath:ctx-security.xml",
"classpath:ctx-common.xml",
"classpath:ctx-configuration-test.xml"})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class CleanupTest extends AbstractTestNGSpringContextTests {
private static final Trace LOGGER = TraceManager.getTrace(CleanupTest.class);
public static final File FOLDER_REPO = new File("./src/test/resources/repo");
@Autowired
private TaskManagerQuartzImpl taskManager;
@Autowired
private RepositoryService repositoryService;
@Autowired
private PrismContext prismContext;
@Test
public void testTasksCleanup() throws Exception {
// GIVEN
final File file = new File(FOLDER_REPO, "tasks-for-cleanup.xml");
List<PrismObject<? extends Objectable>> elements = prismContext.parserFor(file).parseObjects();
OperationResult result = new OperationResult("tasks cleanup");
for (PrismObject<? extends Objectable> object : elements) {
String oid = repositoryService.addObject((PrismObject) object, null, result);
AssertJUnit.assertTrue(StringUtils.isNotEmpty(oid));
}
// WHEN
// because now we can't move system time (we're not using DI for it) we create policy
// which should always point to 2013-05-07T12:00:00.000+02:00
final long NOW = System.currentTimeMillis();
Calendar when = create_2013_07_12_12_00_Calendar();
CleanupPolicyType policy = createPolicy(when, NOW);
taskManager.cleanupTasks(policy, taskManager.createTaskInstance(), result);
// THEN
List<PrismObject<TaskType>> tasks = repositoryService.searchObjects(TaskType.class, null, null, result);
AssertJUnit.assertNotNull(tasks);
display("tasks", tasks);
AssertJUnit.assertEquals(1, tasks.size());
PrismObject<TaskType> task = tasks.get(0);
XMLGregorianCalendar timestamp = task.getPropertyRealValue(TaskType.F_COMPLETION_TIMESTAMP,
XMLGregorianCalendar.class);
Date finished = XMLGregorianCalendarType.asDate(timestamp);
Date mark = new Date(NOW);
Duration duration = policy.getMaxAge();
duration.addTo(mark);
AssertJUnit.assertTrue("finished: " + finished + ", mark: " + mark, finished.after(mark));
}
private Calendar create_2013_07_12_12_00_Calendar() {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+2"));
calendar.set(Calendar.YEAR, 2013);
calendar.set(Calendar.MONTH, Calendar.MAY);
calendar.set(Calendar.DAY_OF_MONTH, 7);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar;
}
private Duration createDuration(Calendar when, long now) throws Exception {
long seconds = (now - when.getTimeInMillis()) / 1000;
return DatatypeFactory.newInstance().newDuration("PT" + seconds + "S").negate();
}
private CleanupPolicyType createPolicy(Calendar when, long now) throws Exception {
CleanupPolicyType policy = new CleanupPolicyType();
Duration duration = createDuration(when, now);
policy.setMaxAge(duration);
return policy;
}
}