/* * Copyright (c) NASK, NCSC * * This file is part of HoneySpider Network 2.1. * * This is a free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package pl.nask.hsn2.workflow.engine; import java.util.TreeSet; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import pl.nask.hsn2.bus.api.BusManager; import pl.nask.hsn2.bus.operations.JobStatus; import pl.nask.hsn2.bus.operations.TaskErrorReasonType; import pl.nask.hsn2.framework.suppressor.SingleThreadTasksSuppressor; import pl.nask.hsn2.framework.workflow.engine.WorkflowAlreadyDeployedException; import pl.nask.hsn2.framework.workflow.engine.WorkflowAlreadyRegisteredException; import pl.nask.hsn2.framework.workflow.engine.WorkflowDescriptor; import pl.nask.hsn2.framework.workflow.engine.WorkflowEngineException; import pl.nask.hsn2.framework.workflow.engine.WorkflowNotRegisteredException; import pl.nask.hsn2.framework.workflow.hwl.Output; import pl.nask.hsn2.framework.workflow.hwl.ProcessDefinition; import pl.nask.hsn2.framework.workflow.hwl.Service; import pl.nask.hsn2.framework.workflow.hwl.Workflow; import pl.nask.hsn2.framework.workflow.job.WorkflowJob; import pl.nask.hsn2.utils.AtomicLongIdGenerator; public class IgnoreErrorsWorkflowEngineTest { private static final String ALL_ERRORS_IGNORED = "w1"; private static final String NO_ERRORS_ALLOWED = "w2"; private static final String TWO_PROCESSES_IGNORED = "w3"; ActivitiWorkflowEngine activityEngine; ActivitiWorkflowDefinitionManager workflowManager ; WorkflowEngineTest.MyBus myBus; @Test(dataProvider="dataProvider") public void twoServicesAllErrorsIgnoredTest(TaskErrorReasonType err,String name) throws WorkflowEngineException { TaskErrorReasonType error = err; WorkflowDescriptor wd = workflowManager.get(ALL_ERRORS_IGNORED); final long jobId = activityEngine.startJob(wd); WorkflowJob job = activityEngine.getJob(jobId); job.resume(); int taskId = myBus.getLastTaskId(); activityEngine.taskAccepted(jobId, taskId); Assert.assertEquals(job.getStatus(), JobStatus.PROCESSING); Assert.assertEquals(job.getActiveStepName(),"service(service1)"); activityEngine.taskError(jobId, taskId,error , name); Assert.assertEquals(job.getStatus(), JobStatus.PROCESSING); Assert.assertEquals(job.getActiveStepName(),"service(service2)"); taskId = myBus.getLastTaskId(); activityEngine.taskAccepted(jobId, taskId); activityEngine.taskCompleted(jobId, taskId, new TreeSet<Long>()); Assert.assertEquals(job.getStatus(),JobStatus.COMPLETED); Assert.assertEquals(job.isEnded(), true); } @Test(dataProvider="dataProvider") public void noErrorsIgnored(TaskErrorReasonType err,String name) throws WorkflowEngineException { WorkflowDescriptor wd = workflowManager.get(NO_ERRORS_ALLOWED); TaskErrorReasonType error = err; final long jobId = activityEngine.startJob(wd); WorkflowJob job = activityEngine.getJob(jobId); job.resume(); int taskId = myBus.getLastTaskId(); activityEngine.taskAccepted(jobId, taskId); Assert.assertEquals(job.getActiveStepName(), "service(service1)"); activityEngine.taskError(jobId, taskId, error, name); Assert.assertEquals(job.getStatus(),JobStatus.FAILED); Assert.assertEquals(job.getErrorMessage(), name + " (1)"); } @DataProvider(name="dataProvider") public Object[][] dataProvider() { Object[][] ret = new Object[TaskErrorReasonType.values().length][2]; for (int i=0; i < TaskErrorReasonType.values().length; i++) { ret[i][0] = TaskErrorReasonType.values()[i]; ret[i][1] = TaskErrorReasonType.values()[i].name(); } return ret; } @Test(dataProvider="dataProvider") public void twoProcessesWithIgnored(TaskErrorReasonType err,String n) throws WorkflowEngineException { WorkflowDescriptor wd = workflowManager.get(TWO_PROCESSES_IGNORED); final long jobId = activityEngine.startJob(wd); WorkflowJob job = activityEngine.getJob(jobId); job.resume(); int taskId = myBus.getLastTaskId(); activityEngine.taskAccepted(jobId, taskId); Assert.assertEquals(job.getStatus(), JobStatus.PROCESSING); Assert.assertEquals(job.getActiveStepName(),"service(service1)"); activityEngine.taskError(jobId, taskId, err,n); Assert.assertEquals(job.getStatus(), JobStatus.COMPLETED); } @Test public void taskCompletedTwoProcessesReferenceTest() throws WorkflowEngineException { WorkflowDescriptor wd = workflowManager.get(TWO_PROCESSES_IGNORED); final long jobId = activityEngine.startJob(wd); WorkflowJob job = activityEngine.getJob(jobId); job.resume(); Assert.assertEquals(job.getStatus(), JobStatus.PROCESSING); int taskId = myBus.getLastTaskId(); Assert.assertEquals(job.getActiveStepName(),"service(service1)"); activityEngine.taskAccepted(jobId, taskId); TreeSet<Long> set = new TreeSet<Long>(); set.add(1l); activityEngine.taskCompleted(jobId, taskId, set); Assert.assertEquals(job.getStatus(), JobStatus.PROCESSING); taskId = myBus.getLastTaskId(); activityEngine.taskAccepted(jobId, taskId); activityEngine.taskCompleted(jobId, taskId, new TreeSet<Long>()); Assert.assertEquals(job.getStatus(), JobStatus.COMPLETED); } @BeforeClass public void beforeClass() throws WorkflowEngineException { myBus = new WorkflowEngineTest.MyBus(); BusManager.setBus(myBus); activityEngine = new ActivitiWorkflowEngine(new AtomicLongIdGenerator(), new SingleThreadTasksSuppressor(true), 1) ; workflowManager = new ActivitiWorkflowDefinitionManager(); createWorkflows(); } private void createWorkflows() throws WorkflowAlreadyRegisteredException, WorkflowAlreadyDeployedException, WorkflowNotRegisteredException { Workflow w = new Workflow(); Service service = createServiceInstance("service1"); ProcessDefinition process = new ProcessDefinition("main"); process.addExecutionPoint(service); process.addExecutionPoint(new Service("service2")); w.addProcess(process); WorkflowDescriptor wd = workflowManager.createDescritor(ALL_ERRORS_IGNORED, "AnyErrors", w); workflowManager.registerWorkflow(wd); workflowManager.deploy(ALL_ERRORS_IGNORED); w = new Workflow(); process = new ProcessDefinition("main"); process.addExecutionPoint(new Service("service1")); process.addExecutionPoint(new Service("service2")); w.addProcess(process); wd = workflowManager.createDescritor(NO_ERRORS_ALLOWED, "NoErrors", w); workflowManager.registerWorkflow(wd); workflowManager.deploy(NO_ERRORS_ALLOWED); w = new Workflow(); service = createServiceInstance("service1"); service.addOutput(new Output("process1")); process = new ProcessDefinition("main"); process.addExecutionPoint(service); w.addProcess(process); process = new ProcessDefinition("process1"); service = createServiceInstance("service2"); process.addExecutionPoint(service); w.addProcess(process); Assert.assertEquals(w.getProcessDefinitions().size() , 2); wd = workflowManager.createDescritor(TWO_PROCESSES_IGNORED, "TwoProcesses", w); workflowManager.registerWorkflow(wd); workflowManager.deploy(TWO_PROCESSES_IGNORED); Assert.assertEquals(workflowManager.getWorkflowDefinitions(true).size() , 3); } private Service createServiceInstance(String string) { Service service = new Service(string); for (TaskErrorReasonType t: TaskErrorReasonType.values()) { service.addIgnoreErrors(t); } return service; } @AfterClass public void afterClass() { } }