/** * Creates a new job definition create request based on fixed parameters. */ public JobDefinitionCreateRequest createJobDefinitionCreateRequest() { return createJobDefinitionCreateRequest(null); }
/** * 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 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 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 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 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(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); }
/** * Creates a new standard job definition. * * @return the created job definition. * @throws Exception if any problems were encountered. */ private JobDefinition createJobDefinition() throws Exception { // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create job definition create request using hard coded test values. JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); // Create the job definition in the database. JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(request, false); // Validate the created job definition. validateJobDefinition(jobDefinition); return jobDefinition; }
/** * This method tests the happy path scenario in which no parameters are given. */ @Test public void testCreateJobDefinitionWithNoParams() throws Exception { // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create and persist a valid job definition. JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); request.setParameters(null); // Try creating the job definition. jobDefinitionService.createJobDefinition(request, false); }
@Test(expected = ObjectNotFoundException.class) public void testUpdateJobDefinitionJobNameNoExist() throws Exception { // Create an update request. JobDefinitionUpdateRequest updateRequest = createUpdateRequest(jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest()); // Update the process Id to match a valid namespace and invalid job name to pass validation. updateRequest.setActivitiJobXml(updateRequest.getActivitiJobXml() .replace(TEST_ACTIVITI_NAMESPACE_CD + "." + TEST_ACTIVITI_JOB_NAME, TEST_ACTIVITI_NAMESPACE_CD + "." + INVALID_NAME)); // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Try to update a job definition that has a namespace that exists, but a job name that doesn't exist. jobDefinitionService.updateJobDefinition(TEST_ACTIVITI_NAMESPACE_CD, INVALID_NAME, updateRequest, false); }
/** * This method tests the scenario in which the jobName is invalid IllegalArgumentException is expected to be thrown. */ @Test(expected = IllegalArgumentException.class) public void testCreateJobDefinitionNoJobName() throws Exception { String invalidJobName = TEST_ACTIVITI_NAMESPACE_CD; // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); // Enter the invalid job name. request.setJobName(invalidJobName); // The following method is expected to throw an IllegalArgumentException. jobDefinitionService.createJobDefinition(request, false); }
/** * This method tests the scenario in which the user tries to register the same job flow twice AlreadyExistsException is expected to be thrown. */ @Test(expected = AlreadyExistsException.class) public void testCreateJobDefinitionAlreadyExists() throws Exception { // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create and persist a valid job definition. JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); jobDefinitionService.createJobDefinition(request, false); // Create the same request again which is an invalid operation, as the workflow exists. // Following must throw AlreadyExistsException jobDefinitionService.createJobDefinition(request, false); }
/** * Asserts that when a job definition is created with the given {@link S3PropertiesLocation}, then an exception of the given type and message is thrown. * * @param s3PropertiesLocation {@link S3PropertiesLocation} * @param exceptionType expected exception type * @param exceptionMessage expected exception message */ private void testCreateJobDefinitionWithS3PropertiesLocationValidate(S3PropertiesLocation s3PropertiesLocation, Class<? extends Exception> exceptionType, String exceptionMessage) { namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); request.setS3PropertiesLocation(s3PropertiesLocation); try { jobDefinitionService.createJobDefinition(request, false); Assert.fail("expected " + exceptionType + ", but no exception was thrown"); } catch (Exception e) { Assert.assertEquals("thrown exception type", exceptionType, e.getClass()); Assert.assertEquals("thrown exception message", exceptionMessage, e.getMessage()); } } }
/** * This method tests the happy path scenario in which all the parameters including the attributes are given. */ @Test public void testCreateJobDefinitionWithParams() throws Exception { // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create and persist a valid job definition. JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); // Add parameters List<Parameter> parameterEntities = new ArrayList<>(); Parameter parameterEntity = new Parameter(); parameterEntity.setName(ATTRIBUTE_NAME_1_MIXED_CASE); parameterEntity.setValue(ATTRIBUTE_VALUE_1); parameterEntities.add(parameterEntity); request.setParameters(parameterEntities); // Try creating the job definition. jobDefinitionService.createJobDefinition(request, false); }
@Test public void testUpdateJobDefinition() throws Exception { // Create job definition create request using hard coded test values. JobDefinitionCreateRequest createRequest = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); // Set 2 distinct parameters. List<Parameter> parameters = new ArrayList<>(); createRequest.setParameters(parameters); Parameter parameter = new Parameter(ATTRIBUTE_NAME_1_MIXED_CASE, ATTRIBUTE_VALUE_1); parameters.add(parameter); parameter = new Parameter(ATTRIBUTE_NAME_2_MIXED_CASE, ATTRIBUTE_VALUE_2); parameters.add(parameter); // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create the job definition in the database. JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(createRequest, false); // Create an update request with a varied set of data that is based on the same data used in the create request. JobDefinitionUpdateRequest updateRequest = createUpdateRequest(createRequest); // Update the job definition in the database. JobDefinition updatedJobDefinition = jobDefinitionService.updateJobDefinition(createRequest.getNamespace(), createRequest.getJobName(), updateRequest, false); // Validate the updated job definition. assertEquals(new JobDefinition(jobDefinition.getId(), jobDefinition.getNamespace(), jobDefinition.getJobName(), updateRequest.getDescription(), updateRequest.getActivitiJobXml(), updateRequest.getParameters(), jobDefinition.getS3PropertiesLocation(), HerdDaoSecurityHelper.SYSTEM_USER), updatedJobDefinition); }
/** * Creates a job definition based on the specified Activiti XML classpath resource location. * * @param activitiXmlClasspathResourceName the Activiti XML classpath resource location. * * @return the job definition. * @throws Exception if any errors were encountered. */ public JobDefinition createJobDefinition(String activitiXmlClasspathResourceName) throws Exception { // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(AbstractServiceTest.TEST_ACTIVITI_NAMESPACE_CD); // Create and persist a valid job definition. JobDefinitionCreateRequest jobDefinitionCreateRequest = createJobDefinitionCreateRequest(activitiXmlClasspathResourceName); JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(jobDefinitionCreateRequest, false); // Validate the returned object against the input. assertEquals(new JobDefinition(jobDefinition.getId(), jobDefinitionCreateRequest.getNamespace(), jobDefinitionCreateRequest.getJobName(), jobDefinitionCreateRequest.getDescription(), jobDefinitionCreateRequest.getActivitiJobXml(), jobDefinitionCreateRequest.getParameters(), jobDefinitionCreateRequest.getS3PropertiesLocation(), HerdDaoSecurityHelper.SYSTEM_USER), jobDefinition); return jobDefinition; }
/** * Asserts that when a job definition is created using {@link S3PropertiesLocation}, the S3 location information is persisted. * * @throws Exception */ @Test public void testCreateJobDefinitionWithS3PropertiesLocationPersistsEntity() throws Exception { S3PropertiesLocation s3PropertiesLocation = getS3PropertiesLocation(); namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); request.setS3PropertiesLocation(s3PropertiesLocation); JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(request, false); Assert.assertEquals("jobDefinition s3PropertiesLocation", request.getS3PropertiesLocation(), jobDefinition.getS3PropertiesLocation()); JobDefinitionEntity jobDefinitionEntity = herdDao.findById(JobDefinitionEntity.class, jobDefinition.getId()); Assert.assertNotNull("jobDefinitionEntity is null", jobDefinitionEntity); Assert.assertEquals("jobDefinitionEntity s3BucketName", s3PropertiesLocation.getBucketName(), jobDefinitionEntity.getS3BucketName()); Assert.assertEquals("jobDefinitionEntity s3ObjectKey", s3PropertiesLocation.getKey(), jobDefinitionEntity.getS3ObjectKey()); }
/** * Tests an edge case where the job definition was persisted with some S3 properties location, but due to some datafix, the S3 properties location's object * key was removed, but not the bucket name. The service should still work, it would simply ignore the definition's S3 properties location. * * @throws Exception */ @Test public void testCreateJobWithS3PropertiesJobDefinitionWrongDatafixSafety() throws Exception { // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create a job definition create request using hard coded test values. JobDefinitionCreateRequest jobDefinitionCreateRequest = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); jobDefinitionCreateRequest.setS3PropertiesLocation(getS3PropertiesLocation("testBucketName", "testObjectKey", new Parameter("testName", "testValue"))); jobDefinitionCreateRequest.setParameters(null); // Create the job definition. JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(jobDefinitionCreateRequest, false); Integer jobDefinitionId = jobDefinition.getId(); JobDefinitionEntity jobDefinitionEntity = herdDao.findById(JobDefinitionEntity.class, jobDefinitionId); jobDefinitionEntity.setS3ObjectKey(null); // Create a job create request using hard coded test values. JobCreateRequest jobCreateRequest = jobServiceTestHelper.createJobCreateRequest(TEST_ACTIVITI_NAMESPACE_CD, TEST_ACTIVITI_JOB_NAME); jobCreateRequest.setParameters(null); // Create the job. Job resultJob = jobService.createAndStartJob(jobCreateRequest); Assert.assertNotNull("resultJob parameters", resultJob.getParameters()); }
@Test public void testUpdateJobDefinitionWithS3PropertiesClear() throws Exception { S3PropertiesLocation s3PropertiesLocation = getS3PropertiesLocation(); // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create job definition create request using hard coded test values. JobDefinitionCreateRequest createRequest = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); createRequest.setS3PropertiesLocation(s3PropertiesLocation); // Create the job definition in the database. JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(createRequest, false); // Create an update request with a varied set of data that is based on the same data used in the create request. JobDefinitionUpdateRequest updateRequest = createUpdateRequest(createRequest); // Update the job definition in the database. JobDefinition updatedJobDefinition = jobDefinitionService.updateJobDefinition(createRequest.getNamespace(), createRequest.getJobName(), updateRequest, false); JobDefinitionEntity updatedJobDefinitionEntity = herdDao.findById(JobDefinitionEntity.class, updatedJobDefinition.getId()); // Validate the updated job definition. assertEquals(new JobDefinition(jobDefinition.getId(), jobDefinition.getNamespace(), jobDefinition.getJobName(), updateRequest.getDescription(), updateRequest.getActivitiJobXml(), updateRequest.getParameters(), null, HerdDaoSecurityHelper.SYSTEM_USER), updatedJobDefinition); // Validate the updated job definition entity. Assert.assertNull("updatedJobDefinitionEntity s3BucketName", updatedJobDefinitionEntity.getS3BucketName()); Assert.assertNull("updatedJobDefinitionEntity s3ObjectKey", updatedJobDefinitionEntity.getS3ObjectKey()); }
@Test public void testUpdateJobDefinitionWithS3Properties() throws Exception { S3PropertiesLocation s3PropertiesLocation = getS3PropertiesLocation(); // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create job definition create request using hard coded test values. JobDefinitionCreateRequest createRequest = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); // Create the job definition in the database. JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(createRequest, false); // Create an update request with a varied set of data that is based on the same data used in the create request. JobDefinitionUpdateRequest updateRequest = createUpdateRequest(createRequest); updateRequest.setS3PropertiesLocation(s3PropertiesLocation); // Update the job definition in the database. JobDefinition updatedJobDefinition = jobDefinitionService.updateJobDefinition(createRequest.getNamespace(), createRequest.getJobName(), updateRequest, false); JobDefinitionEntity updatedJobDefinitionEntity = herdDao.findById(JobDefinitionEntity.class, updatedJobDefinition.getId()); // Validate the updated job definition. assertEquals(new JobDefinition(jobDefinition.getId(), jobDefinition.getNamespace(), jobDefinition.getJobName(), updateRequest.getDescription(), updateRequest.getActivitiJobXml(), updateRequest.getParameters(), s3PropertiesLocation, HerdDaoSecurityHelper.SYSTEM_USER), updatedJobDefinition); // Validate the updated job definition entity. Assert.assertEquals("updatedJobDefinitionEntity s3BucketName", s3PropertiesLocation.getBucketName(), updatedJobDefinitionEntity.getS3BucketName()); Assert.assertEquals("updatedJobDefinitionEntity s3ObjectKey", s3PropertiesLocation.getKey(), updatedJobDefinitionEntity.getS3ObjectKey()); }