/* * Copyright 2013 the original author or authors. * * 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.springframework.xd.dirt.plugins.job; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.when; import java.io.File; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Properties; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.mockito.Mockito; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobParameter; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.integration.launch.JobLaunchRequest; import org.springframework.integration.support.MessageBuilder; import org.springframework.integration.test.util.TestUtils; import org.springframework.messaging.Message; import org.springframework.xd.tuple.Tuple; import org.springframework.xd.tuple.TupleBuilder; /** * @author Gunnar Hillert * @author Ilayaperumal Gopinathan */ public class JobLaunchRequestTransformerTests { JobRegistry mockedJobRegistry; Job mockedJob; JobLaunchRequestTransformer transformer; RunIdIncrementer jobParameterIncrementer = new RunIdIncrementer(); @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @Before public void setup() throws Exception { mockedJob = Mockito.mock(Job.class); mockedJobRegistry = Mockito.mock(JobRegistry.class); when(mockedJobRegistry.getJob("testJob")).thenReturn(mockedJob); transformer = new JobLaunchRequestTransformer(mockedJobRegistry, "testJob"); } @Test public void createJobParametersWithUniqueParam() throws Exception { final Message<String> message = MessageBuilder.withPayload("{\"param1\":\"Kenny\", \"param2\":\"Cartman\"}").build(); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); assertNotNull(jobLaunchRequest.getJobParameters()); assertTrue(jobLaunchRequest.getJobParameters().getParameters().size() == 3); assertEquals("Kenny", jobLaunchRequest.getJobParameters().getString("param1")); assertEquals("Cartman", jobLaunchRequest.getJobParameters().getString("param2")); assertNotNull(jobLaunchRequest.getJobParameters().getString("random")); } @Test public void createJobParametersUsingPropertiesWithUniqueParam() throws Exception { final Properties properties = new Properties(); properties.put("param1", "Kenny"); properties.put("param2", "Cartman"); final Message<Properties> message = MessageBuilder.withPayload(properties).build(); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); assertNotNull(jobLaunchRequest.getJobParameters()); assertTrue(jobLaunchRequest.getJobParameters().getParameters().size() == 3); assertEquals("Kenny", jobLaunchRequest.getJobParameters().getString("param1")); assertEquals("Cartman", jobLaunchRequest.getJobParameters().getString("param2")); assertNotNull(jobLaunchRequest.getJobParameters().getString("random")); } @Test public void createJobParametersUsingMapWithUniqueParam() throws Exception { final Map<String, String> map = new HashMap<String, String>(); map.put("param1", "Kenny"); map.put("param2", "Cartman"); final Message<Map<String, String>> message = MessageBuilder.withPayload(map).build(); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); assertNotNull(jobLaunchRequest.getJobParameters()); assertTrue(jobLaunchRequest.getJobParameters().getParameters().size() == 3); assertEquals("Kenny", jobLaunchRequest.getJobParameters().getString("param1")); assertEquals("Cartman", jobLaunchRequest.getJobParameters().getString("param2")); assertNotNull(jobLaunchRequest.getJobParameters().getString("random")); } @Test public void createJobParametersUsingFileWithUniqueParam() throws Exception { final File file = temporaryFolder.newFile("MyPayloadFile.txt"); final Message<File> message = MessageBuilder.withPayload(file).build(); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); final JobParameters jobParameters = jobLaunchRequest.getJobParameters(); assertNotNull(jobParameters); assertTrue(jobParameters.getParameters().size() == 2); assertTrue( String.format("Property '%s' did not end with '%s'.", ExpandedJobParametersConverter.ABSOLUTE_FILE_PATH, "MyPayloadFile.txt"), jobParameters.getString(ExpandedJobParametersConverter.ABSOLUTE_FILE_PATH).endsWith( "MyPayloadFile.txt")); assertNotNull(jobLaunchRequest.getJobParameters().getString("random")); } @Test public void createJobParametersUsingTupleWithUniqueParam() throws Exception { final Tuple tuple = TupleBuilder.tuple().of("foo", "123,456"); final Message<Tuple> message = MessageBuilder.withPayload(tuple).build(); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); final JobParameters jobParameters = jobLaunchRequest.getJobParameters(); assertNotNull(jobParameters); assertTrue(jobParameters.getParameters().size() == 2); assertEquals("123,456", jobParameters.getString("foo")); assertNotNull(jobLaunchRequest.getJobParameters().getString("random")); } @Test public void createJobParametersWithoutUniqueParam() throws Exception { final Message<String> message = MessageBuilder.withPayload("{\"param1\":\"Kenny\", \"param2\":\"Cartman\"}").build(); transformer.setMakeParametersUnique(false); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); final JobParameters jobParameters = jobLaunchRequest.getJobParameters(); assertNotNull(jobParameters); assertTrue(jobParameters.getParameters().size() == 2); assertEquals("Kenny", jobParameters.getString("param1")); assertEquals("Cartman", jobParameters.getString("param2")); for (JobParameter jobParameter : jobParameters.getParameters().values()) { assertTrue(jobParameter.isIdentifying()); } } @Test public void createNotIdentifyingJobParameters() throws Exception { final Message<String> message = MessageBuilder.withPayload("{\"-param1\":\"Kenny\", \"-param2\":\"Cartman\"}").build(); transformer.setMakeParametersUnique(false); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); final JobParameters jobParameters = jobLaunchRequest.getJobParameters(); assertNotNull(jobParameters); assertTrue(jobParameters.getParameters().size() == 2); assertEquals("Kenny", jobParameters.getString("param1")); assertEquals("Cartman", jobParameters.getString("param2")); for (JobParameter jobParameter : jobParameters.getParameters().values()) { assertFalse(jobParameter.isIdentifying()); } } @Test public void createTypedJobParameters() throws Exception { final Message<String> message = MessageBuilder.withPayload( "{\"param1(long)\":\"1234\", \"mydate(date)\":\"1978-05-01\"}").build(); transformer.setMakeParametersUnique(false); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); final JobParameters jobParameters = jobLaunchRequest.getJobParameters(); assertNotNull(jobParameters); assertTrue(jobParameters.getParameters().size() == 2); assertEquals("1234", jobParameters.getString("param1")); assertEquals(Long.valueOf(1234), jobParameters.getLong("param1")); final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); assertEquals(dateFormat.parse("1978/05/01"), jobParameters.getDate("mydate")); } @Test public void createTypedJobParametersWithCustomDateFormat() throws Exception { final Message<String> message = MessageBuilder.withPayload( "{\"param1\":\"We should all use ISO dates\", \"mydate(date)\":\"2013-08-15T14:50Z\"}").build(); final DateFormat isoDateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); transformer.setDateFormat(isoDateformat); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); final JobParameters jobParameters = jobLaunchRequest.getJobParameters(); assertNotNull(jobParameters); assertTrue(jobParameters.getParameters().size() == 3); assertEquals(isoDateformat.parse("2013-08-15T14:50Z"), jobParameters.getDate("mydate")); } @Test public void createTypedJobParametersWithNullDateFormat() throws Exception { try { transformer.setDateFormat(null); } catch (IllegalArgumentException e) { return; } fail("Expected an IllegalArgumentException to be thrown."); } @Test public void createTypedJobParametersWithNullNumberFormat() throws Exception { try { transformer.setNumberFormat(null); } catch (IllegalArgumentException e) { return; } fail("Expected an IllegalArgumentException to be thrown."); } @Test public void createTypedJobParametersWithCustomNumberFormat() throws Exception { final Message<String> message = MessageBuilder.withPayload("{\"param1(double)\":\"123,55\"}").build(); final NumberFormat germanNumberFormat = NumberFormat.getInstance(Locale.GERMANY); transformer.setNumberFormat(germanNumberFormat); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); final JobParameters jobParameters = jobLaunchRequest.getJobParameters(); assertNotNull(jobParameters); assertTrue(jobParameters.getParameters().size() == 2); assertEquals(Double.valueOf(123.55), jobParameters.getDouble("param1")); } @Test public void createEmptyJobParametersWithUniqueParameter() throws Exception { final Message<String> message = MessageBuilder.withPayload("").build(); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); final JobParameters jobParameters = jobLaunchRequest.getJobParameters(); assertNotNull(jobParameters); assertTrue(jobParameters.getParameters().size() == 1); } @Test public void createEmptyJobParametersWithOutUniqueParameter() throws Exception { final Message<String> message = MessageBuilder.withPayload("").build(); transformer.setMakeParametersUnique(false); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); final JobParameters jobParameters = jobLaunchRequest.getJobParameters(); assertNotNull(jobParameters); assertTrue(jobParameters.getParameters().size() == 0); } @Test public void createJobParametersWithParamThatMatchesRandom() throws Exception { final Message<String> message = MessageBuilder.withPayload("{\"random\":\"Will throw Exception\"}").build(); try { transformer.toJobLaunchRequest(message); } catch (IllegalStateException e) { return; } fail("Expected an IllegalStateException to be thrown."); } @Test public void createJobParametersWithInvalidJSON() throws Exception { final Message<String> message = MessageBuilder.withPayload("this should fail").build(); try { transformer.toJobLaunchRequest(message); } catch (IllegalArgumentException e) { assertEquals("Unable to convert provided JSON to Map<String, Object>", e.getMessage()); return; } fail("Expected an IllegalStateException to be thrown."); } @Test public void createJobParametersWithUTFString() throws Exception { /** I want to go to Japan. */ final String stringToPostInJapanese = "\u65e5\u672c\u306b\u884c\u304d\u305f\u3044\u3002"; final Message<String> message = MessageBuilder.withPayload("{\"param1\":\"" + stringToPostInJapanese + "\"}").build(); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); final JobParameters jobParameters = jobLaunchRequest.getJobParameters(); assertNotNull(jobParameters); assertTrue(jobParameters.getParameters().size() == 2); assertEquals(stringToPostInJapanese, jobParameters.getString("param1")); } @Test public void createJobParametersWithInvalidPayloadType() throws Exception { final Message<Date> message = MessageBuilder.withPayload(new Date()).build(); try { transformer.toJobLaunchRequest(message); } catch (IllegalArgumentException e) { assertEquals("This transformer does not support payloads of type " + Date.class.getSimpleName(), e.getMessage()); return; } fail("Expected an IllegalArgumentException to be thrown."); } @Test public void testSetDateFormat() throws Exception { final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyy.MMMMM.dd"); transformer.setDateFormat(simpleDateFormat); final SimpleDateFormat retrievedDateFormat = TestUtils.getPropertyValue(transformer, "jobParametersConverter.dateFormat", SimpleDateFormat.class); assertEquals(simpleDateFormat, retrievedDateFormat); transformer.setDateFormatAsString(null); final SimpleDateFormat retrievedDateFormat2 = TestUtils.getPropertyValue(transformer, "jobParametersConverter.dateFormat", SimpleDateFormat.class); assertEquals(simpleDateFormat, retrievedDateFormat2); transformer.setDateFormatAsString("yyMMdd"); final SimpleDateFormat retrievedDateFormat3 = TestUtils.getPropertyValue(transformer, "jobParametersConverter.dateFormat", SimpleDateFormat.class); assertEquals("yyMMdd", retrievedDateFormat3.toPattern()); } @Test public void testSetNumberFormat() throws Exception { final NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.GERMAN); transformer.setNumberFormat(numberFormat); final NumberFormat retrievedNumberFormat = TestUtils.getPropertyValue(transformer, "jobParametersConverter.numberFormat", NumberFormat.class); assertEquals(numberFormat, retrievedNumberFormat); transformer.setNumberFormatAsString(null); final NumberFormat retrievedNumberFormat2 = TestUtils.getPropertyValue(transformer, "jobParametersConverter.numberFormat", NumberFormat.class); assertEquals(numberFormat, retrievedNumberFormat2); transformer.setNumberFormatAsString("#000000.000"); final DecimalFormat retrievedDecimalFormat = TestUtils.getPropertyValue(transformer, "jobParametersConverter.numberFormat", DecimalFormat.class); assertEquals("#000000.000", retrievedDecimalFormat.toPattern()); } @Test public void testJobParameterIncrementer() { jobParameterIncrementer.setKey("test-param-incrementer"); when(mockedJob.getJobParametersIncrementer()).thenReturn(jobParameterIncrementer); final Message<String> message = MessageBuilder.withPayload("{\"test-param-incrementer(long)\":\"1234\"}").build(); final JobLaunchRequest jobLaunchRequest = transformer.toJobLaunchRequest(message); assertNotNull(jobLaunchRequest.getJobParameters()); assertTrue(jobLaunchRequest.getJobParameters().getParameters().size() == 2); // Now check if the job parameter is incremented assertEquals(Long.valueOf(1235), jobLaunchRequest.getJobParameters().getLong("test-param-incrementer")); } }