/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* 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 org.jbpm.test.functional.log;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.assertj.core.api.Assertions;
import org.jbpm.services.task.audit.service.TaskJPAAuditService;
import org.jbpm.test.JbpmTestCase;
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.task.TaskService;
import org.kie.api.task.model.Status;
import org.kie.api.task.model.Task;
import org.kie.internal.task.api.AuditTask;
import qa.tools.ikeeper.annotation.BZ;
/**
* Tests for:
* - AuditTaskInstanceLogDeleteBuilder
* - TaskEventInstanceLogDeleteBuilder
* - TaskJPAAuditService.clear()
*/
public class TaskLogCleanTest extends JbpmTestCase {
private static final String HUMAN_TASK =
"org/jbpm/test/functional/common/HumanTask.bpmn2";
private static final String HUMAN_TASK_ID =
"org.jbpm.test.functional.common.HumanTask";
private static final String INPUT_ASSOCIATION =
"org/jbpm/test/functional/log/TaskLogClean-inputAssociation.bpmn2";
private static final String INPUT_ASSOCIATION_ID =
"org.jbpm.test.functional.log.TaskLogClean-inputAssociation";
private static final String HUMAN_TASK_MULTIACTORS =
"org/jbpm/test/functional/common/HumanTaskWithMultipleActors.bpmn2";
private static final String HUMAN_TASK_MULTIACTORS_ID =
"org.jbpm.test.functional.common.HumanTaskWithMultipleActors";
private KieSession kieSession;
private List<ProcessInstance> processInstanceList;
private TaskJPAAuditService taskAuditService;
@Override
public void setUp() throws Exception {
super.setUp();
taskAuditService = new TaskJPAAuditService(getEmf());
taskAuditService.clear();
}
@Override
public void tearDown() throws Exception {
try {
taskAuditService.clear();
taskAuditService.dispose();
abortProcess(kieSession, processInstanceList);
} finally {
super.tearDown();
}
}
@Test
public void testDeleteLogsByProcessId() {
kieSession = createKSession(HUMAN_TASK);
processInstanceList = startProcess(kieSession, HUMAN_TASK_ID, 2);
abortProcess(kieSession, processInstanceList);
int deletedLogs = taskAuditService.auditTaskDelete()
.processId(HUMAN_TASK_ID)
.build()
.execute();
Assertions.assertThat(deletedLogs).isEqualTo(2);
Assertions.assertThat(getAllAuditTaskLogs()).hasSize(0);
}
@Test
public void testDeleteLogsByProcessName() {
kieSession = createKSession(HUMAN_TASK);
processInstanceList = startProcess(kieSession, HUMAN_TASK_ID, 3);
abortProcess(kieSession, processInstanceList);
int resultCount = taskAuditService.auditTaskDelete()
.processInstanceId(processInstanceList.get(0).getId(), processInstanceList.get(1).getId())
.build()
.execute();
Assertions.assertThat(resultCount).isEqualTo(2);
TaskService taskService = getRuntimeEngine().getTaskService();
List<Long> taskIdList = taskService.getTasksByProcessInstanceId(processInstanceList.get(2).getId());
Assertions.assertThat(taskIdList).hasSize(1);
}
@Test
@BZ("1188702")
public void testDeleteLogsByDate() {
kieSession = createKSession(HUMAN_TASK);
processInstanceList = startProcess(kieSession, HUMAN_TASK_ID, 4);
abortProcess(kieSession, processInstanceList);
TaskService taskService = getRuntimeEngine().getTaskService();
// Delete the last two task logs
for (int i = processInstanceList.size() - 1; i > 0; i--) {
List<Long> taskIdList = taskService.getTasksByProcessInstanceId(processInstanceList.get(i).getId());
Assertions.assertThat(taskIdList).hasSize(1);
Task task = taskService.getTaskById(taskIdList.get(0));
Assertions.assertThat(task).isNotNull();
int resultCount = taskAuditService.auditTaskDelete()
.date(task.getTaskData().getCreatedOn())
.build()
.execute();
Assertions.assertThat(resultCount).isEqualTo(1);
}
}
@Test
@BZ("1193017")
public void testDeleteLogsByDateRange() throws InterruptedException {
processInstanceList = new ArrayList<ProcessInstance>();
kieSession = createKSession(HUMAN_TASK, INPUT_ASSOCIATION);
Date date1 = new Date();
processInstanceList.addAll(startProcess(kieSession, INPUT_ASSOCIATION_ID, 2));
processInstanceList.addAll(startProcess(kieSession, HUMAN_TASK_ID, 1));
Date date2 = new Date();
Thread.sleep(1000);
processInstanceList.addAll(startProcess(kieSession, INPUT_ASSOCIATION_ID, 1));
processInstanceList.addAll(startProcess(kieSession, HUMAN_TASK_ID, 1));
abortProcess(kieSession, processInstanceList);
// Delete tasks created from date1 to date2.
int resultCount = deleteAuditTaskInstanceLogs(date1, date2);
Assertions.assertThat(resultCount).isEqualTo(3);
Assertions.assertThat(getAllAuditTaskLogs()).hasSize(2);
}
private void testDeleteLogsByDateRange(Date startDate, Date endDate, boolean remove) {
processInstanceList = new ArrayList<ProcessInstance>();
kieSession = createKSession(HUMAN_TASK);
processInstanceList.addAll(startProcess(kieSession, HUMAN_TASK_ID, 5));
abortProcess(kieSession, processInstanceList);
// Delete tasks created from date1 to date2.
int resultCount = deleteAuditTaskInstanceLogs(startDate, endDate);
Assertions.assertThat(resultCount).isEqualTo(remove ? 5 : 0);
Assertions.assertThat(getAllAuditTaskLogs()).hasSize(remove ? 0 : 5);
}
@Test
public void testDeleteLogsByDateRangeEndingYesterday() {
testDeleteLogsByDateRange(getYesterday(), getYesterday(), false);
}
@Test
public void testDeleteLogsByDateRangeIncludingToday() {
testDeleteLogsByDateRange(getYesterday(), getTomorrow(), true);
}
@Test
public void testDeleteLogsByDateRangeStartingTomorrow() {
testDeleteLogsByDateRange(getTomorrow(), getTomorrow(), false);
}
@Test
public void testDeleteTaskEventByDate() {
kieSession = createKSession(HUMAN_TASK_MULTIACTORS);
Date startDate = new Date();
processInstanceList = startProcess(kieSession, HUMAN_TASK_MULTIACTORS_ID, 1);
// Get the task
TaskService taskService = getRuntimeEngine().getTaskService();
Task task = taskService.getTaskById(
taskService.getTasksByProcessInstanceId(
processInstanceList.get(0).getId()).get(0));
Assertions.assertThat(task).isNotNull();
Assertions.assertThat(task.getTaskData().getStatus()).isEqualTo(Status.Ready);
// Perform 2 operation on the task
taskService.claim(task.getId(), "krisv");
taskService.start(task.getId(), "krisv");
taskService.complete(task.getId(), "krisv", null);
// Remove the instance from the running list as it has ended already.
processInstanceList.clear();
// Delete all task operation between dates
int resultCount = taskAuditService.taskEventInstanceLogDelete()
.dateRangeStart(startDate)
.dateRangeEnd(new Date())
.build()
.execute();
// Changes are as follows (see https://docs.jboss.org/jbpm/v6.1/userguide/jBPMTaskService.html#jBPMTaskLifecycle):
// 1) Created -> Ready (automatic change because there are multiple actors)
// 2) Ready -> Reserved (by claim)
// 3) Reserved -> In Progress (by start)
// 4) In Progress -> Completed (by complete)
Assertions.assertThat(resultCount).isEqualTo(4);
}
@Test
@BZ("1192912")
public void testClearLogs() {
kieSession = createKSession(HUMAN_TASK);
processInstanceList = startProcess(kieSession, HUMAN_TASK_ID, 2);
taskAuditService.clear();
Assertions.assertThat(getAllAuditTaskLogs()).hasSize(processInstanceList.size());
abortProcess(kieSession, processInstanceList);
taskAuditService.clear();
Assertions.assertThat(getAllAuditTaskLogs()).hasSize(0);
}
private int deleteAuditTaskInstanceLogs(Date startDate, Date endDate) {
return taskAuditService.auditTaskDelete()
.dateRangeStart(startDate)
.dateRangeEnd(endDate)
.build()
.execute();
}
private List<AuditTask> getAllAuditTaskLogs() {
return taskAuditService.auditTaskQuery()
.build()
.getResultList();
}
private Date getTomorrow() {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.DATE, 1);
return c.getTime();
}
private Date getYesterday() {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.DATE, -1);
return c.getTime();
}
private void abortProcess(KieSession kieSession, List<ProcessInstance> processInstanceList) {
for (ProcessInstance processInstance : processInstanceList) {
abortProcess(kieSession, processInstance.getId());
}
}
private void abortProcess(KieSession kieSession, long pid) {
ProcessInstance processInstance = kieSession.getProcessInstance(pid);
if (processInstance != null && processInstance.getState() == ProcessInstance.STATE_ACTIVE) {
kieSession.abortProcessInstance(pid);
}
}
private List<ProcessInstance> startProcess(KieSession kieSession, String processId, int count) {
List<ProcessInstance> piList = new ArrayList<ProcessInstance>();
for (int i = 0; i < count; i++) {
ProcessInstance pi = kieSession.startProcess(processId);
if (pi != null) {
piList.add(pi);
}
}
return piList;
}
}