/* * Copyright 2008-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.batch.core.repository.dao; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import org.junit.Before; import org.junit.Test; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.StepExecution; import org.springframework.batch.item.ExecutionContext; import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; import org.springframework.transaction.annotation.Transactional; /** * Tests for {@link ExecutionContextDao} implementations. */ public abstract class AbstractExecutionContextDaoTests extends AbstractTransactionalJUnit4SpringContextTests { private JobInstanceDao jobInstanceDao; private JobExecutionDao jobExecutionDao; private StepExecutionDao stepExecutionDao; private ExecutionContextDao contextDao; private JobExecution jobExecution; private StepExecution stepExecution; @Before public void setUp() { jobInstanceDao = getJobInstanceDao(); jobExecutionDao = getJobExecutionDao(); stepExecutionDao = getStepExecutionDao(); contextDao = getExecutionContextDao(); JobInstance ji = jobInstanceDao.createJobInstance("testJob", new JobParameters()); jobExecution = new JobExecution(ji, new JobParameters()); jobExecutionDao.saveJobExecution(jobExecution); stepExecution = new StepExecution("stepName", jobExecution); stepExecutionDao.saveStepExecution(stepExecution); } /** * @return Configured {@link ExecutionContextDao} implementation ready for * use. */ protected abstract JobExecutionDao getJobExecutionDao(); /** * @return Configured {@link ExecutionContextDao} implementation ready for * use. */ protected abstract JobInstanceDao getJobInstanceDao(); /** * @return Configured {@link ExecutionContextDao} implementation ready for * use. */ protected abstract StepExecutionDao getStepExecutionDao(); /** * @return Configured {@link ExecutionContextDao} implementation ready for * use. */ protected abstract ExecutionContextDao getExecutionContextDao(); @Transactional @Test public void testSaveAndFindJobContext() { ExecutionContext ctx = new ExecutionContext(Collections.<String, Object> singletonMap("key", "value")); jobExecution.setExecutionContext(ctx); contextDao.saveExecutionContext(jobExecution); ExecutionContext retrieved = contextDao.getExecutionContext(jobExecution); assertEquals(ctx, retrieved); } @Transactional @Test public void testSaveAndFindExecutionContexts() { List<StepExecution> stepExecutions = new ArrayList<StepExecution>(); for (int i = 0; i < 3; i++) { JobInstance ji = jobInstanceDao.createJobInstance("testJob" + i, new JobParameters()); JobExecution je = new JobExecution(ji, new JobParameters()); jobExecutionDao.saveJobExecution(je); StepExecution se = new StepExecution("step" + i, je); se.setStatus(BatchStatus.STARTED); se.setReadSkipCount(i); se.setProcessSkipCount(i); se.setWriteSkipCount(i); se.setProcessSkipCount(i); se.setRollbackCount(i); se.setLastUpdated(new Date(System.currentTimeMillis())); se.setReadCount(i); se.setFilterCount(i); se.setWriteCount(i); stepExecutions.add(se); } stepExecutionDao.saveStepExecutions(stepExecutions); contextDao.saveExecutionContexts(stepExecutions); for (int i = 0; i < 3; i++) { ExecutionContext retrieved = contextDao.getExecutionContext(stepExecutions.get(i).getJobExecution()); assertEquals(stepExecutions.get(i).getExecutionContext(), retrieved); } } @Transactional @Test(expected = IllegalArgumentException.class) public void testSaveNullExecutionContexts() { contextDao.saveExecutionContexts(null); } @Transactional @Test public void testSaveEmptyExecutionContexts() { contextDao.saveExecutionContexts(new ArrayList<StepExecution>()); } @Transactional @Test public void testSaveAndFindEmptyJobContext() { ExecutionContext ctx = new ExecutionContext(); jobExecution.setExecutionContext(ctx); contextDao.saveExecutionContext(jobExecution); ExecutionContext retrieved = contextDao.getExecutionContext(jobExecution); assertEquals(ctx, retrieved); } @Transactional @Test public void testUpdateContext() { ExecutionContext ctx = new ExecutionContext(Collections .<String, Object> singletonMap("key", "value")); jobExecution.setExecutionContext(ctx); contextDao.saveExecutionContext(jobExecution); ctx.putLong("longKey", 7); contextDao.updateExecutionContext(jobExecution); ExecutionContext retrieved = contextDao.getExecutionContext(jobExecution); assertEquals(ctx, retrieved); assertEquals(7, retrieved.getLong("longKey")); } @Transactional @Test public void testSaveAndFindStepContext() { ExecutionContext ctx = new ExecutionContext(Collections.<String, Object> singletonMap("key", "value")); stepExecution.setExecutionContext(ctx); contextDao.saveExecutionContext(stepExecution); ExecutionContext retrieved = contextDao.getExecutionContext(stepExecution); assertEquals(ctx, retrieved); } @Transactional @Test public void testSaveAndFindEmptyStepContext() { ExecutionContext ctx = new ExecutionContext(); stepExecution.setExecutionContext(ctx); contextDao.saveExecutionContext(stepExecution); ExecutionContext retrieved = contextDao.getExecutionContext(stepExecution); assertEquals(ctx, retrieved); } @Transactional @Test public void testUpdateStepContext() { ExecutionContext ctx = new ExecutionContext(Collections.<String, Object> singletonMap("key", "value")); stepExecution.setExecutionContext(ctx); contextDao.saveExecutionContext(stepExecution); ctx.putLong("longKey", 7); contextDao.updateExecutionContext(stepExecution); ExecutionContext retrieved = contextDao.getExecutionContext(stepExecution); assertEquals(ctx, retrieved); assertEquals(7, retrieved.getLong("longKey")); } @Transactional @Test public void testStoreInteger() { ExecutionContext ec = new ExecutionContext(); ec.put("intValue", new Integer(343232)); stepExecution.setExecutionContext(ec); contextDao.saveExecutionContext(stepExecution); ExecutionContext restoredEc = contextDao.getExecutionContext(stepExecution); assertEquals(ec, restoredEc); } }