diff --git a/src/main/java/it/inaf/oats/vospace/persistence/JobDAO.java b/src/main/java/it/inaf/oats/vospace/persistence/JobDAO.java index f9fe118885a7611b07bd8535eb4face48c981d4c..31d443de8836fd53ab4be1e49ed17a36537335cc 100644 --- a/src/main/java/it/inaf/oats/vospace/persistence/JobDAO.java +++ b/src/main/java/it/inaf/oats/vospace/persistence/JobDAO.java @@ -253,27 +253,34 @@ public class JobDAO { public void updateJob(JobSummary job) { - String sql = "UPDATE job SET phase = ?, results = ? "; + String sql = "UPDATE job SET (phase, results"; ErrorSummary errorSummary = job.getErrorSummary(); if(errorSummary != null) { - sql += ", error_message = ?, error_type = ?, error_has_detail = ? "; + sql += ", error_message, error_type, error_has_detail"; + } + + sql += ") = (?, ?"; + + if(errorSummary != null) + { + sql += ", ?, ?, ?"; } - sql += "WHERE job_id = ?"; + sql += ") WHERE job_id = ?"; jdbcTemplate.update(sql, ps -> { int i = 0; ps.setObject(++i, job.getPhase().name(), Types.OTHER); ps.setObject(++i, toJson(job.getResults()), Types.OTHER); - ps.setString(++i, job.getJobId()); if(errorSummary != null) { ps.setString(++i, errorSummary.getMessage()); - ps.setObject(++i, errorSummary.getType().name(), Types.OTHER); + ps.setObject(++i, errorSummary.getType().value(), Types.OTHER); ps.setBoolean(++i, errorSummary.isHasDetail()); } + ps.setString(++i, job.getJobId()); }); } diff --git a/src/test/java/it/inaf/oats/vospace/persistence/JobDAOTest.java b/src/test/java/it/inaf/oats/vospace/persistence/JobDAOTest.java index 0173ba286f830a175b272f1aced105abc616599f..b13399b729da576bb45bd825e88ae89e51afc199 100644 --- a/src/test/java/it/inaf/oats/vospace/persistence/JobDAOTest.java +++ b/src/test/java/it/inaf/oats/vospace/persistence/JobDAOTest.java @@ -19,6 +19,8 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.Optional; import java.time.LocalDateTime; import java.time.Month; +import net.ivoa.xml.uws.v1.ErrorSummary; +import net.ivoa.xml.uws.v1.ErrorSummaryFactory; import net.ivoa.xml.uws.v1.Jobs; @ExtendWith(SpringExtension.class) @@ -35,9 +37,7 @@ public class JobDAOTest { dao = new JobDAO(dataSource); } - @Test - public void testJob() { - + private JobSummary getJob() { Transfer transfer = new Transfer(); transfer.setDirection("pushToVoSpace"); transfer.setTarget("vos://example.com!vospace/mynode"); @@ -50,6 +50,21 @@ public class JobDAOTest { jobInfo.getAny().add(transfer); job.setJobInfo(jobInfo); + return job; + } + + // don't want to override equals method just for testing without a use case + private boolean areEqual(ErrorSummary a, ErrorSummary b) { + return (a.getMessage().equals(b.getMessage()) + && a.getType().equals(b.getType()) + && a.isHasDetail() == b.isHasDetail()); + } + + @Test + public void testJob() { + + JobSummary job = getJob(); + dao.createJob(job); assertTrue(dao.getJob("123").isPresent()); @@ -61,6 +76,56 @@ public class JobDAOTest { assertEquals(ExecutionPhase.EXECUTING, dao.getJob("123").get().getPhase()); } + @Test + public void testCreateJobWithError() { + JobSummary job = getJob(); + + job.setPhase(ExecutionPhase.ERROR); + + // A generic picked randomly + ErrorSummary errorSummary + = ErrorSummaryFactory.newErrorSummary( + ErrorSummaryFactory.VOSpaceFault.PERMISSION_DENIED); + + job.setErrorSummary(errorSummary); + + dao.createJob(job); + + // Retrieve it back + Optional<JobSummary> retrievedJobOpt = dao.getJob(job.getJobId()); + assertTrue(retrievedJobOpt.isPresent()); + + JobSummary retrievedJob = retrievedJobOpt.get(); + assertEquals(ExecutionPhase.ERROR, retrievedJob.getPhase()); + assertTrue(areEqual(job.getErrorSummary(), retrievedJob.getErrorSummary())); + + } + + @Test + public void testUpdateJobWithError() { + JobSummary job = getJob(); + + dao.createJob(job); + + job.setPhase(ExecutionPhase.ERROR); + // A generic picked randomly + ErrorSummary errorSummary + = ErrorSummaryFactory.newErrorSummary( + ErrorSummaryFactory.VOSpaceFault.PERMISSION_DENIED); + + job.setErrorSummary(errorSummary); + + dao.updateJob(job); + + // Retrieve it back + Optional<JobSummary> retrievedJobOpt = dao.getJob(job.getJobId()); + assertTrue(retrievedJobOpt.isPresent()); + + JobSummary retrievedJob = retrievedJobOpt.get(); + assertEquals(ExecutionPhase.ERROR, retrievedJob.getPhase()); + assertTrue(areEqual(job.getErrorSummary(), retrievedJob.getErrorSummary())); + } + @Test public void testJobsList() { // Check no arguments @@ -159,10 +224,10 @@ public class JobDAOTest { public void testJobsAllchecks() { // Check no arguments String user = "user1"; - List<ExecutionPhase> phaseList = List.of(ExecutionPhase.QUEUED, + List<ExecutionPhase> phaseList = List.of(ExecutionPhase.QUEUED, ExecutionPhase.PENDING); - List<JobService.JobType> directionList = - List.of(JobService.JobType.pullFromVoSpace, + List<JobService.JobType> directionList + = List.of(JobService.JobType.pullFromVoSpace, JobService.JobType.pullToVoSpace); LocalDateTime ldt