/* * Copyright 2006-2014 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.batch.core; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Date; import java.util.HashSet; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.springframework.batch.core.step.StepSupport; import org.springframework.batch.item.ExecutionContext; import org.springframework.util.SerializationUtils; /** * @author Dave Syer * */ public class StepExecutionTests { private StepExecution execution = newStepExecution(new StepSupport("stepName"), new Long(23)); private StepExecution blankExecution = newStepExecution(new StepSupport("blank"), null); private ExecutionContext foobarEc = new ExecutionContext(); @Before public void setUp() throws Exception { foobarEc.put("foo", "bar"); } @Test public void testStepExecution() { assertNull(new StepExecution("step", null).getId()); } @Test public void testStepExecutionWithNullId() { assertNull(new StepExecution("stepName", new JobExecution(new JobInstance(null,"foo"), null)).getId()); } /** * Test method for * {@link org.springframework.batch.core.JobExecution#getEndTime()}. */ @Test public void testGetEndTime() { assertNull(execution.getEndTime()); execution.setEndTime(new Date(0L)); assertEquals(0L, execution.getEndTime().getTime()); } /** * Test method for * {@link org.springframework.batch.core.JobExecution#getStartTime()}. */ @Test public void testGetStartTime() { assertNotNull(execution.getStartTime()); execution.setStartTime(new Date(10L)); assertEquals(10L, execution.getStartTime().getTime()); } /** * Test method for * {@link org.springframework.batch.core.JobExecution#getStatus()}. */ @Test public void testGetStatus() { assertEquals(BatchStatus.STARTING, execution.getStatus()); execution.setStatus(BatchStatus.COMPLETED); assertEquals(BatchStatus.COMPLETED, execution.getStatus()); } /** * Test method for * {@link org.springframework.batch.core.JobExecution#getJobId()}. */ @Test public void testGetJobId() { assertEquals(23, execution.getJobExecutionId().longValue()); } /** * Test method for * {@link org.springframework.batch.core.JobExecution#getExitStatus()}. */ @Test public void testGetExitCode() { assertEquals(ExitStatus.EXECUTING, execution.getExitStatus()); execution.setExitStatus(ExitStatus.COMPLETED); assertEquals(ExitStatus.COMPLETED, execution.getExitStatus()); } /** * Test method for * {@link org.springframework.batch.core.StepExecution#getCommitCount()}. */ @Test public void testGetCommitCount() { execution.setCommitCount(123); assertEquals(123, execution.getCommitCount()); } @Test public void testGetFilterCount() { execution.setFilterCount(123); assertEquals(123, execution.getFilterCount()); } @Test public void testGetJobExecution() throws Exception { assertNotNull(execution.getJobExecution()); } @Test public void testApplyContribution() throws Exception { StepContribution contribution = execution.createStepContribution(); contribution.incrementReadSkipCount(); contribution.incrementWriteSkipCount(); contribution.incrementReadCount(); contribution.incrementWriteCount(7); contribution.incrementFilterCount(1); execution.apply(contribution); assertEquals(1, execution.getReadSkipCount()); assertEquals(1, execution.getWriteSkipCount()); assertEquals(1, execution.getReadCount()); assertEquals(7, execution.getWriteCount()); assertEquals(1, execution.getFilterCount()); } @Test public void testTerminateOnly() throws Exception { assertFalse(execution.isTerminateOnly()); execution.setTerminateOnly(); assertTrue(execution.isTerminateOnly()); } @Test public void testNullNameIsIllegal() throws Exception { try { new StepExecution(null, new JobExecution(new JobInstance(null, "job"), null)); fail(); } catch (IllegalArgumentException e) { // expected } } @Test public void testToString() throws Exception { assertTrue("Should contain read count: " + execution.toString(), execution.toString().indexOf("read") >= 0); assertTrue("Should contain write count: " + execution.toString(), execution.toString().indexOf("write") >= 0); assertTrue("Should contain filter count: " + execution.toString(), execution.toString().indexOf("filter") >= 0); assertTrue("Should contain commit count: " + execution.toString(), execution.toString().indexOf("commit") >= 0); assertTrue("Should contain rollback count: " + execution.toString(), execution.toString().indexOf("rollback") >= 0); } @Test public void testExecutionContext() throws Exception { assertNotNull(execution.getExecutionContext()); ExecutionContext context = new ExecutionContext(); context.putString("foo", "bar"); execution.setExecutionContext(context); assertEquals("bar", execution.getExecutionContext().getString("foo")); } @Test public void testEqualsWithSameName() throws Exception { Step step = new StepSupport("stepName"); Entity stepExecution1 = newStepExecution(step,11L,4L); Entity stepExecution2 = newStepExecution(step,11L,5L); assertFalse(stepExecution1.equals(stepExecution2)); } @Test public void testEqualsWithSameIdentifier() throws Exception { Step step = new StepSupport("stepName"); Entity stepExecution1 = newStepExecution(step, new Long(11)); Entity stepExecution2 = newStepExecution(step, new Long(11)); assertEquals(stepExecution1, stepExecution2); } @Test public void testEqualsWithNull() throws Exception { Entity stepExecution = newStepExecution(new StepSupport("stepName"), new Long(11)); assertFalse(stepExecution.equals(null)); } @Test public void testEqualsWithNullIdentifiers() throws Exception { Entity stepExecution = newStepExecution(new StepSupport("stepName"), new Long(11)); assertFalse(stepExecution.equals(blankExecution)); } @Test public void testEqualsWithNullJob() throws Exception { Entity stepExecution = newStepExecution(new StepSupport("stepName"), new Long(11)); assertFalse(stepExecution.equals(blankExecution)); } @Test public void testEqualsWithSelf() throws Exception { assertTrue(execution.equals(execution)); } @Test public void testEqualsWithDifferent() throws Exception { Entity stepExecution = newStepExecution(new StepSupport("foo"), new Long(13)); assertFalse(execution.equals(stepExecution)); } @Test public void testEqualsWithNullStepId() throws Exception { Step step = new StepSupport("name"); execution = newStepExecution(step, new Long(31)); assertEquals("name", execution.getStepName()); StepExecution stepExecution = newStepExecution(step, new Long(31)); assertEquals(stepExecution.getJobExecutionId(), execution.getJobExecutionId()); assertTrue(execution.equals(stepExecution)); } @Test public void testHashCode() throws Exception { assertTrue("Hash code same as parent", new Entity(execution.getId()).hashCode() != execution.hashCode()); } @Test public void testHashCodeWithNullIds() throws Exception { assertTrue("Hash code not same as parent", new Entity(execution.getId()).hashCode() != blankExecution .hashCode()); } @Test public void testHashCodeViaHashSet() throws Exception { Set<StepExecution> set = new HashSet<StepExecution>(); set.add(execution); assertTrue(set.contains(execution)); execution.setExecutionContext(foobarEc); assertTrue(set.contains(execution)); } @Test public void testSerialization() throws Exception { ExitStatus status = ExitStatus.NOOP; execution.setExitStatus(status); execution.setExecutionContext(foobarEc); byte[] serialized = SerializationUtils.serialize(execution); StepExecution deserialized = (StepExecution) SerializationUtils.deserialize(serialized); assertEquals(execution, deserialized); assertEquals(status, deserialized.getExitStatus()); assertNotNull(deserialized.getFailureExceptions()); } @Test public void testAddException() throws Exception{ RuntimeException exception = new RuntimeException(); assertEquals(0, execution.getFailureExceptions().size()); execution.addFailureException(exception); assertEquals(1, execution.getFailureExceptions().size()); assertEquals(exception, execution.getFailureExceptions().get(0)); } /** * Test method for * {@link org.springframework.batch.core.JobExecution#getStatus()}. */ @Test public void testDowngradeStatus() { execution.setStatus(BatchStatus.FAILED); execution.upgradeStatus(BatchStatus.COMPLETED); assertEquals(BatchStatus.FAILED, execution.getStatus()); } private StepExecution newStepExecution(Step step, Long jobExecutionId) { return newStepExecution(step, jobExecutionId, 4); } private StepExecution newStepExecution(Step step, Long jobExecutionId, long stepExecutionId) { JobInstance job = new JobInstance(3L, "testJob"); StepExecution execution = new StepExecution(step.getName(), new JobExecution(job, jobExecutionId, new JobParameters(), null), stepExecutionId); return execution; } }