Skip to content

Commit 8e158ad

Browse files
committed
SNA-17. Add tests to validate non-reentrant save and optimistic update
1 parent 806a20f commit 8e158ad

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

neo4j-adapter/src/test/java/com/github/valb3r/springbatch/adapters/dao/repository/JobExecutionDaoTest.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
import org.springframework.batch.item.ExecutionContext;
2222
import org.springframework.beans.factory.annotation.Autowired;
2323
import org.springframework.boot.test.context.SpringBootTest;
24+
import org.springframework.dao.OptimisticLockingFailureException;
2425

2526
import java.util.Date;
2627
import java.util.HashMap;
2728
import java.util.Map;
2829

2930
import static org.assertj.core.api.Assertions.assertThat;
31+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
3032

3133
@SpringBootTest(classes = Neo4jTestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE)
3234
class JobExecutionDaoTest {
@@ -74,6 +76,15 @@ void saveJobExecution() {
7476
assertThat(exec.getJobParameters()).isEqualToComparingFieldByField(newExec.getJobParameters());
7577
}
7678

79+
@Test
80+
void saveSameJobExecutionThrows() {
81+
var newExec = execution();
82+
execDao.saveJobExecution(newExec);
83+
84+
assertThatThrownBy(() -> execDao.saveJobExecution(newExec))
85+
.isInstanceOf(IllegalStateException.class);
86+
}
87+
7788
@Test
7889
void updateJobExecution() {
7990
var newExec = execution();
@@ -94,7 +105,23 @@ void updateJobExecution() {
94105
assertThat(exec.getStatus()).isEqualTo(BatchStatus.ABANDONED);
95106
assertThat(exec.getExecutionContext()).isEqualTo(params());
96107
assertThat(exec.getJobParameters()).isEqualToComparingFieldByField(newExec.getJobParameters());
108+
}
109+
110+
@Test
111+
void updateOldVersionThrows() {
112+
var newExec = execution();
113+
execDao.saveJobExecution(newExec);
114+
115+
ExecutionContext newCtx = new ExecutionContext(params());
116+
newExec.setExitStatus(ExitStatus.COMPLETED);
117+
newExec.setStatus(BatchStatus.ABANDONED);
118+
newExec.setExecutionContext(newCtx);
97119

120+
execDao.updateJobExecution(newExec);
121+
newExec.setVersion(newExec.getVersion() - 1);
122+
123+
assertThatThrownBy(() -> execDao.updateJobExecution(newExec))
124+
.isInstanceOf(OptimisticLockingFailureException.class);
98125
}
99126

100127
/**
@@ -186,6 +213,22 @@ void synchronizeStatus() {
186213
.isEqualTo(BatchStatus.ABANDONED);
187214
}
188215

216+
@Test
217+
void synchronizeStatusDoesNotUpdateSame() {
218+
JobParameters parameters = new JobParametersBuilder().addLong(PARAM, LONG_PARAM_VAL).toJobParameters();
219+
val instance = instanceDao.createJobInstance(JOB_NAME, parameters);
220+
221+
var execToSave = execution(instance);
222+
execToSave.setStartTime(new Date());
223+
execDao.saveJobExecution(execToSave);
224+
225+
execToSave.setStatus(BatchStatus.ABANDONED);
226+
execDao.synchronizeStatus(execToSave);
227+
228+
assertThat(execDao.getJobExecution(execToSave.getId())).extracting(JobExecution::getStatus)
229+
.isEqualTo(BatchStatus.STARTING);
230+
}
231+
189232
private JobExecution execution(JobInstance instance) {
190233
JobParameters parameters = new JobParametersBuilder().addLong(PARAM, LONG_PARAM_VAL).toJobParameters();
191234
return new JobExecution(instance, parameters);

neo4j-adapter/src/test/java/com/github/valb3r/springbatch/adapters/dao/repository/StepExecutionDaoTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.github.valb3r.springbatch.adapters.testconfig.common.DbDropper;
77
import com.github.valb3r.springbatch.adapters.testconfig.neo4j.Neo4jTestApplication;
88
import lombok.val;
9+
import lombok.var;
910
import org.junit.jupiter.api.AfterEach;
1011
import org.junit.jupiter.api.Test;
1112
import org.springframework.batch.core.BatchStatus;
@@ -16,12 +17,15 @@
1617
import org.springframework.batch.core.repository.dao.JobExecutionDao;
1718
import org.springframework.batch.core.repository.dao.JobInstanceDao;
1819
import org.springframework.batch.core.repository.dao.StepExecutionDao;
20+
import org.springframework.batch.item.ExecutionContext;
1921
import org.springframework.beans.factory.annotation.Autowired;
2022
import org.springframework.boot.test.context.SpringBootTest;
23+
import org.springframework.dao.OptimisticLockingFailureException;
2124

2225
import java.util.Arrays;
2326

2427
import static org.assertj.core.api.Assertions.assertThat;
28+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2529

2630
@SpringBootTest(classes = Neo4jTestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE)
2731
class StepExecutionDaoTest {
@@ -65,6 +69,16 @@ void saveStepExecution() {
6569
.isEqualTo(execution.getId());
6670
}
6771

72+
@Test
73+
void saveSameStepExecutionThrows() {
74+
val execution = execution();
75+
val stepExecution = new StepExecution(STEP_NAME, execution);
76+
execDao.saveStepExecution(stepExecution);
77+
78+
assertThatThrownBy(() -> execDao.saveStepExecution(stepExecution))
79+
.isInstanceOf(IllegalStateException.class);
80+
}
81+
6882
@Test
6983
void saveStepExecutions() {
7084
val execution = execution();
@@ -105,6 +119,22 @@ void updateStepExecution() {
105119
assertThat(step).isEqualToIgnoringGivenFields(stepExec, "jobExecution", "executionContext");
106120
}
107121

122+
@Test
123+
void updateOldVersionThrows() {
124+
val execution = execution();
125+
val stepExec = new StepExecution(STEP_NAME, execution);
126+
execDao.saveStepExecution(stepExec);
127+
128+
stepExec.setCommitCount(99);
129+
stepExec.setStatus(BatchStatus.ABANDONED);
130+
stepExec.setExitStatus(ExitStatus.FAILED);
131+
execDao.updateStepExecution(stepExec);
132+
stepExec.setVersion(stepExec.getVersion() - 1);
133+
134+
assertThatThrownBy(() -> execDao.updateStepExecution(stepExec))
135+
.isInstanceOf(OptimisticLockingFailureException.class);
136+
}
137+
108138
@Test
109139
void getStepExecution() {
110140
val execution = execution();

0 commit comments

Comments
 (0)