/** * This method tests the happy path scenario by providing all the parameters except attributes */ @Test public void testCreateJobDefinition() throws Exception { jobDefinitionServiceTestHelper.createJobDefinition(null); }
/** * Creates a new job definition create request based on fixed parameters. */ public JobDefinitionCreateRequest createJobDefinitionCreateRequest() { return createJobDefinitionCreateRequest(null); }
/** * Creates a job based on the specified Activiti XML. * * @param activitiXml the Activiti XML. * @param parameters the job parameters. * * @return the job. * @throws Exception if any errors were encountered. */ public Job createJobFromActivitiXml(String activitiXml, List<Parameter> parameters) throws Exception { jobDefinitionServiceTestHelper.createJobDefinitionForActivitiXml(activitiXml); // Start the job synchronously. return jobService .createAndStartJob(createJobCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME, parameters)); }
/** * Creates a job definition based on the specified Activiti XML. * * @param activitiXml the Activiti XML. * * @return the job definition. * @throws Exception if any errors were encountered. */ public JobDefinition createJobDefinitionForActivitiXml(String activitiXml) throws Exception { // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD); // Create and persist a valid job definition. JobDefinitionCreateRequest jobDefinitionCreateRequest = createJobDefinitionCreateRequestFromActivitiXml(activitiXml); JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(jobDefinitionCreateRequest, false); // Validate the returned object against the input. assertNotNull(jobDefinition); assertTrue(jobDefinition.getNamespace().equals(jobDefinitionCreateRequest.getNamespace())); assertTrue(jobDefinition.getJobName().equals(jobDefinitionCreateRequest.getJobName())); assertTrue(jobDefinition.getDescription().equals(jobDefinitionCreateRequest.getDescription())); return jobDefinition; } }
/** * Creates a job based on the specified Activiti XML classpath resource location. * * @param activitiXmlClasspathResourceName the Activiti XML classpath resource location. * * @return the job. * @throws Exception if any errors were encountered. */ public Job createJob(String activitiXmlClasspathResourceName) throws Exception { jobDefinitionServiceTestHelper.createJobDefinition(activitiXmlClasspathResourceName); // Start the job synchronously. return jobService.createAndStartJob(createJobCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME)); }
/** * Creates a new job definition create request based on fixed parameters and a specified activiti XML. * * @param activitiXml the Activiti XML. */ public JobDefinitionCreateRequest createJobDefinitionCreateRequestFromActivitiXml(String activitiXml) { // Create a test list of parameters. List<Parameter> parameters = new ArrayList<>(); Parameter parameter = new Parameter(AbstractServiceTest.ATTRIBUTE_NAME_1_MIXED_CASE, AbstractServiceTest.ATTRIBUTE_NAME_1_MIXED_CASE); parameters.add(parameter); return createJobDefinitionCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME, AbstractServiceTest.JOB_DESCRIPTION, activitiXml, parameters); }
/** * Creates a job based on the specified Activiti XML and defines a EMR cluster definition. * * @param activitiXml the Activiti XML. * @param parameters the job parameters. * * @return the job. * @throws Exception if any errors were encountered. */ public Job createJobForCreateClusterForActivitiXml(String activitiXml, List<Parameter> parameters) throws Exception { jobDefinitionServiceTestHelper.createJobDefinitionForActivitiXml(activitiXml); NamespaceEntity namespaceEntity = namespaceDao.getNamespaceByCd(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD); EmrClusterDefinitionEntity emrClusterDefinitionEntity = emrClusterDefinitionDaoTestHelper .createEmrClusterDefinitionEntity(namespaceEntity, AbstractServiceTest.EMR_CLUSTER_DEFINITION_NAME, IOUtils.toString(resourceLoader.getResource(AbstractServiceTest.EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH).getInputStream())); Parameter parameter = new Parameter("namespace", namespaceEntity.getCode()); parameters.add(parameter); parameter = new Parameter("emrClusterDefinitionName", emrClusterDefinitionEntity.getName()); parameters.add(parameter); parameter = new Parameter("dryRun", null); parameters.add(parameter); parameter = new Parameter("contentType", null); parameters.add(parameter); parameter = new Parameter("emrClusterDefinitionOverride", null); parameters.add(parameter); // Start the job synchronously. return jobService .createAndStartJob(createJobCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME, parameters)); }
/** * Creates a job based on the specified Activiti XML classpath resource location. * * @param activitiXmlClasspathResourceName the Activiti XML classpath resource location. * @param parameters the job parameters. * * @return the job. * @throws Exception if any errors were encountered. */ public Job createJob(String activitiXmlClasspathResourceName, List<Parameter> parameters) throws Exception { jobDefinitionServiceTestHelper.createJobDefinition(activitiXmlClasspathResourceName); // Start the job synchronously. return jobService .createAndStartJob(createJobCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME, parameters)); }
/** * Creates a new job definition create request based on fixed parameters and a specified XML resource location. * * @param activitiXmlClasspathResourceName the classpath resource location to the Activiti XML. If null is specified, then the default * ACTIVITI_XML_HERD_WORKFLOW_WITH_CLASSPATH will be used. */ public JobDefinitionCreateRequest createJobDefinitionCreateRequest(String activitiXmlClasspathResourceName) { // Create a test list of parameters. List<Parameter> parameters = new ArrayList<>(); Parameter parameter = new Parameter(AbstractServiceTest.ATTRIBUTE_NAME_1_MIXED_CASE, AbstractServiceTest.ATTRIBUTE_VALUE_1); parameters.add(parameter); if (activitiXmlClasspathResourceName == null) { activitiXmlClasspathResourceName = AbstractServiceTest.ACTIVITI_XML_HERD_WORKFLOW_WITH_CLASSPATH; } try { return createJobDefinitionCreateRequest(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD, AbstractServiceTest.TEST_ACTIVITI_JOB_NAME, AbstractServiceTest.JOB_DESCRIPTION, IOUtils.toString(resourceLoader.getResource(activitiXmlClasspathResourceName).getInputStream()), parameters); } catch (IOException ex) { throw new RuntimeException("Unable to load Activiti XML from classpath resource: " + activitiXmlClasspathResourceName); } }
/** * This method tests the scenario where a java delegate is not populated again with spring beans. */ @Test public void testDelegateSpringBeansNotPopulatedAgain() throws Exception { BpmnModel bpmnModel = getBpmnModelForXmlResource(ACTIVITI_XML_HERD_WORKFLOW); ServiceTask serviceTask = (ServiceTask) bpmnModel.getProcesses().get(0).getFlowElement("servicetask1"); serviceTask.setImplementation(MockJavaDelegate.class.getCanonicalName()); serviceTask.getFieldExtensions().clear(); // Define the job definition jobDefinitionServiceTestHelper.createJobDefinitionForActivitiXml(getActivitiXmlFromBpmnModel(bpmnModel)); // Executing the job twice so that the same JavaDelegate object is used and spring beans are not wired again. jobService.createAndStartJob(jobServiceTestHelper.createJobCreateRequest(TEST_ACTIVITI_NAMESPACE_CD, TEST_ACTIVITI_JOB_NAME)); jobService.createAndStartJob(jobServiceTestHelper.createJobCreateRequest(TEST_ACTIVITI_NAMESPACE_CD, TEST_ACTIVITI_JOB_NAME)); }
@Test public void testGetJobAssertAccessDeniedGivenJobCompletedAndUserDoesNotHavePermissions() throws Exception { jobDefinitionServiceTestHelper.createJobDefinition(null); Job job = jobService.createAndStartJob(jobServiceTestHelper.createJobCreateRequest(TEST_ACTIVITI_NAMESPACE_CD, TEST_ACTIVITI_JOB_NAME)); String username = "username"; ApplicationUser applicationUser = new ApplicationUser(getClass()); applicationUser.setUserId(username); applicationUser.setNamespaceAuthorizations(new HashSet<>()); SecurityContextHolder.getContext().setAuthentication( new TestingAuthenticationToken(new SecurityUserWrapper(username, "password", false, false, false, false, Collections.emptyList(), applicationUser), null)); try { jobService.getJob(job.getId(), false); fail(); } catch (Exception e) { assertEquals(AccessDeniedException.class, e.getClass()); assertEquals(String.format("User \"%s\" does not have \"[READ]\" permission(s) to the namespace \"%s\"", username, TEST_ACTIVITI_NAMESPACE_CD), e.getMessage()); } }
/** * This method tests the scenario in which the namespace is invalid ObjectNotFoundException is expected to be thrown */ @Test(expected = ObjectNotFoundException.class) public void testCreateJobDefinitionInvalidNamespace() throws Exception { // Create the job request without registering the namespace entity - ${TEST_ACTIVITI_NAMESPACE_CD} JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); // Following method must throw ObjectNotFoundException, as the namespace entity ${TEST_ACTIVITI_NAMESPACE_CD} does not exist. jobDefinitionService.createJobDefinition(request, false); }
/** * This method tests the scenario when an error that is not workflow related is throws while workflow is executing an Async type task like Timer. This error * is logged as ERROR. */ @Test(expected = ActivitiException.class) public void testActivitiReportableError() throws Exception { BpmnModel bpmnModel = getBpmnModelForXmlResource(ACTIVITI_XML_HERD_TIMER_WITH_CLASSPATH); ServiceTask serviceTask = (ServiceTask) bpmnModel.getProcesses().get(0).getFlowElement("servicetask1"); FieldExtension exceptionField = new FieldExtension(); exceptionField.setFieldName("exceptionToThrow"); exceptionField.setExpression("${exceptionToThrow}"); serviceTask.getFieldExtensions().add(exceptionField); jobDefinitionServiceTestHelper.createJobDefinitionForActivitiXml(getActivitiXmlFromBpmnModel(bpmnModel)); List<Parameter> parameters = new ArrayList<>(); Parameter parameter = new Parameter("exceptionToThrow", MockJavaDelegate.EXCEPTION_BPMN_ERROR); parameters.add(parameter); Job job = jobService.createAndStartJob(jobServiceTestHelper.createJobCreateRequest(TEST_ACTIVITI_NAMESPACE_CD, TEST_ACTIVITI_JOB_NAME, parameters)); org.activiti.engine.runtime.Job timer = activitiManagementService.createJobQuery().processInstanceId(job.getId()).timers().singleResult(); if (timer != null) { executeWithoutLogging(Arrays.asList(ActivitiRuntimeHelper.class, TimerExecuteNestedActivityJobHandler.class), () -> { activitiManagementService.executeJob(timer.getId()); }); } }
@Test public void testGetJobAssertAccessDeniedGivenJobRunningAndUserDoesNotHavePermissions() throws Exception { jobDefinitionServiceTestHelper.createJobDefinition(ACTIVITI_XML_TEST_USER_TASK_WITH_CLASSPATH); Job job = jobService.createAndStartJob(jobServiceTestHelper.createJobCreateRequest(TEST_ACTIVITI_NAMESPACE_CD, TEST_ACTIVITI_JOB_NAME)); String username = "username"; ApplicationUser applicationUser = new ApplicationUser(getClass()); applicationUser.setUserId(username); applicationUser.setNamespaceAuthorizations(new HashSet<>()); SecurityContextHolder.getContext().setAuthentication( new TestingAuthenticationToken(new SecurityUserWrapper(username, "password", false, false, false, false, Collections.emptyList(), applicationUser), null)); try { jobService.getJob(job.getId(), false); fail(); } catch (Exception e) { assertEquals(AccessDeniedException.class, e.getClass()); assertEquals(String.format("User \"%s\" does not have \"[READ]\" permission(s) to the namespace \"%s\"", username, TEST_ACTIVITI_NAMESPACE_CD), e.getMessage()); } }
/** * This method tests the scenario in which the user passes an ill-formatted xml file XMLException is expected to be thrown */ @Test(expected = IllegalArgumentException.class) public void testCreateJobDefinitionInvalidActivitiXml() throws Exception { // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create and persist a valid job definition. JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); // Get the XML file for the test workflow. InputStream xmlStream = resourceLoader.getResource(ACTIVITI_XML_HERD_WORKFLOW_WITH_CLASSPATH).getInputStream(); // Just remove "startEvent" text from the XML file which makes the following line in the XML file as INVALID // <startEvent id="startevent1" name="Start"></startEvent> request.setActivitiJobXml(IOUtils.toString(xmlStream).replaceAll("startEvent", "")); // Try creating the job definition and this must throw XMLException. jobDefinitionService.createJobDefinition(request, false); }
/** * This method tests the scenario when an workflow related error is throws while workflow is executing an Async type task like Timer. This error is logged * as WARN. */ @Test(expected = ActivitiException.class) public void testActivitiUnReportableError() throws Exception { BpmnModel bpmnModel = getBpmnModelForXmlResource(ACTIVITI_XML_HERD_TIMER_WITH_CLASSPATH); ServiceTask serviceTask = (ServiceTask) bpmnModel.getProcesses().get(0).getFlowElement("servicetask1"); serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION); serviceTask.setImplementation("${BeanNotAvailable}"); jobDefinitionServiceTestHelper.createJobDefinitionForActivitiXml(getActivitiXmlFromBpmnModel(bpmnModel)); Job job = jobService.createAndStartJob(jobServiceTestHelper.createJobCreateRequest(TEST_ACTIVITI_NAMESPACE_CD, TEST_ACTIVITI_JOB_NAME, null)); org.activiti.engine.runtime.Job timer = activitiManagementService.createJobQuery().processInstanceId(job.getId()).timers().singleResult(); if (timer != null) { executeWithoutLogging(TimerExecuteNestedActivityJobHandler.class, () -> { activitiManagementService.executeJob(timer.getId()); }); } }
@Test public void testGetJobAssertNoErrorGivenJobCompletedAndUserDoesHasPermissions() throws Exception { jobDefinitionServiceTestHelper.createJobDefinition(null); Job job = jobService.createAndStartJob(jobServiceTestHelper.createJobCreateRequest(TEST_ACTIVITI_NAMESPACE_CD, TEST_ACTIVITI_JOB_NAME)); String username = "username"; ApplicationUser applicationUser = new ApplicationUser(getClass()); applicationUser.setUserId(username); applicationUser.setNamespaceAuthorizations(new HashSet<>()); applicationUser.getNamespaceAuthorizations().add(new NamespaceAuthorization(TEST_ACTIVITI_NAMESPACE_CD, Arrays.asList(NamespacePermissionEnum.READ))); SecurityContextHolder.getContext().setAuthentication( new TestingAuthenticationToken(new SecurityUserWrapper(username, "password", false, false, false, false, Collections.emptyList(), applicationUser), null)); try { jobService.getJob(job.getId(), false); } catch (AccessDeniedException e) { fail(); } }
/** * This method tests the scenario in which an invalid Java class name is given. This must throw IllegalArgumentException from the Activiti layer. */ @Test(expected = IllegalArgumentException.class) public void testCreateJobDefinitionInvalidActivitiElement() throws Exception { // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create and persist a valid job definition. JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); // Read the Activiti XML file so that an error can be injected. InputStream xmlStream = resourceLoader.getResource(ACTIVITI_XML_HERD_WORKFLOW_WITH_CLASSPATH).getInputStream(); // Inject an error by having an invalid Activiti element name in the XML file. // Note that XML file structure is correct as per the XML schema. However, there is an invalid Activiti element in the XML file. // The line below will be affected in the XML file as per this error injection. // <serviceTask id="servicetask1" name="Test Service Step" activiti:class="org.activiti.engine.impl.test.NoOpServiceTask"> request.setActivitiJobXml(IOUtils.toString(xmlStream).replaceAll("serviceTask", "invalidActivitiTask")); // Try creating the job definition and the Activiti layer mush throw an exception. jobDefinitionService.createJobDefinition(request, false); }
@Test public void testGetJobAssertNoErrorGivenJobRunningAndUserDoesHasPermissions() throws Exception { jobDefinitionServiceTestHelper.createJobDefinition(ACTIVITI_XML_TEST_USER_TASK_WITH_CLASSPATH); Job job = jobService.createAndStartJob(jobServiceTestHelper.createJobCreateRequest(TEST_ACTIVITI_NAMESPACE_CD, TEST_ACTIVITI_JOB_NAME)); String username = "username"; ApplicationUser applicationUser = new ApplicationUser(getClass()); applicationUser.setUserId(username); applicationUser.setNamespaceAuthorizations(new HashSet<>()); applicationUser.getNamespaceAuthorizations().add(new NamespaceAuthorization(TEST_ACTIVITI_NAMESPACE_CD, Arrays.asList(NamespacePermissionEnum.READ))); SecurityContextHolder.getContext().setAuthentication( new TestingAuthenticationToken(new SecurityUserWrapper(username, "password", false, false, false, false, Collections.emptyList(), applicationUser), null)); try { jobService.getJob(job.getId(), false); } catch (AccessDeniedException e) { fail(); } }
@Test(expected = ObjectNotFoundException.class) public void testUpdateJobDefinitionNamespaceNoExist() throws Exception { // Create an update request. JobDefinitionUpdateRequest updateRequest = createUpdateRequest(jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest()); // Update the process Id to match an invalid namespace and invalid job name to pass validation. updateRequest.setActivitiJobXml( updateRequest.getActivitiJobXml().replace(TEST_ACTIVITI_NAMESPACE_CD + "." + TEST_ACTIVITI_JOB_NAME, INVALID_NAME + "." + INVALID_NAME)); // Try to update a job definition that has a namespace that doesn't exist. jobDefinitionService.updateJobDefinition(INVALID_NAME, INVALID_NAME, updateRequest, false); }