package edu.stanford.sulair.dlss.dor.dao; import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import edu.stanford.sulair.dlss.dor.AbstractProcessDatabaseTest; import org.junit.Test; import org.springframework.test.context.ContextConfiguration; import edu.stanford.sulair.dlss.dor.admin.Process; @ContextConfiguration public class ProcessDaoTests extends AbstractProcessDatabaseTest { @Test public void insertWorkflowRow() throws ParseException { Process p = new Process(); p.setDruid("dr:123"); p.setDatastream("GoogleWorkflow"); p.setName("download"); p.setStatus("pending"); p.setAttempts(1); SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss z"); Date originalDate = sdf.parse("2008.11.15 13:30:00 PST"); p.setDatetime(originalDate); p.setErrorMessage("message"); p.setErrorText("text"); p.setLifecycle("shelved"); p.setElapsed(1.323); p.setRepository("dor"); dao.persistProcess(p); Date beforeQuery = new Date(); Process p2 = dao.findProcess("dor", "dr:123", "GoogleWorkflow", "download"); assertEquals("GoogleWorkflow", p2.getDatastream()); assertEquals(1, p2.getAttempts()); assertEquals(1, this.countRowsInTable("WORKFLOW")); assertTrue(p2.getDatetime().before(beforeQuery)); assertTrue(p2.getDatetime().equals(originalDate)); assertEquals("message", p2.getErrorMessage()); assertEquals("text", p2.getErrorText()); assertEquals("shelved", p2.getLifecycle()); assertEquals(1.323, p2.getElapsed(), 0.01); assertEquals("dor", p2.getRepository()); } @Test public void insertWorkflowAndFindByAttributes() { Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleWorkflow"); p.setName("download"); p.setStatus("pending"); p.setRepository("dor"); dao.persistProcess(p); p = dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download"); assertEquals("GoogleWorkflow", p.getDatastream()); assertEquals("dor", p.getRepository()); assertEquals(1, this.countRowsInTable("WORKFLOW")); } @Test public void insertWorkflowsAndFindByDruidAndDatastream() { Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleWorkflow"); p.setName("download"); p.setStatus("pending"); p.setRepository("dor"); dao.persistProcess(p); p = dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download"); p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleWorkflow"); p.setName("convert"); p.setStatus("pending"); p.setRepository("dor"); dao.persistProcess(p); List<Process> procs = dao.findProcessesByDruidAndDatastream("dor", "dr:1234", "GoogleWorkflow"); assertEquals(2, procs.size()); assertEquals(2, this.countRowsInTable("WORKFLOW")); } @Test public void updateExistingWorkflowRow() throws Exception { Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleWorkflow"); p.setName("download"); p.setStatus("pending"); p.setAttempts(1); SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss z"); Date originalDate = sdf.parse("2008.11.15 13:30:00 PST"); p.setDatetime(originalDate); p.setLifecycle("ingested"); p.setRepository("dor"); dao.persistProcess(p); p = dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download"); assertEquals(1, this.countRowsInTable("WORKFLOW")); assertEquals(originalDate, p.getDatetime()); Process p2 = new Process(); p2.setId(p.getId()); p2.setDruid("dr:1234"); p2.setDatastream("GoogleWorkflow"); p2.setName("download"); p2.setStatus("done"); p2.setAttempts(2); p2.setLifecycle("downloaded"); p2.setRepository("dor"); dao.persistProcess(p2); assertTrue(p2.getDatetime().after(originalDate)); Date secondDate = (Date) p2.getDatetime().clone(); Process p3 = dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download"); assertEquals(1, this.countRowsInTable("WORKFLOW")); assertEquals("done", p3.getStatus()); assertEquals("downloaded", p3.getLifecycle()); assertEquals(2, p3.getAttempts()); assertTrue(p3.getDatetime().equals(secondDate)); assertTrue(p3.getDatetime().after(originalDate)); } @Test public void deleteAllWorkflowRowsByDruidandRepository() { ArrayList<Process> procs = new ArrayList<Process>(); Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleWorkflow"); p.setName("download"); p.setStatus("pending"); p.setRepository("dor"); dao.persistProcess(p); Process p2 = new Process(); p2.setDruid("dr:1234"); p2.setDatastream("GoogleWorkflow"); p2.setName("convert"); p2.setStatus("done"); p2.setRepository("dor"); dao.persistProcess(p2); Process p3 = new Process(); p3.setDruid("dr:5678"); p3.setDatastream("GoogleWorkflow"); p3.setName("convert"); p3.setStatus("done"); p3.setRepository("dor"); dao.persistProcess(p3); p = dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download"); assertEquals(3, this.countRowsInTable("WORKFLOW")); dao.deleteProcessesByRepoDruidAndWorkflowName("dor", "dr:1234", "GoogleWorkflow"); assertEquals(1, this.countRowsInTable("WORKFLOW")); } private void setupWaitingDruidsByDatastreamAndName() { Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleBooksWF"); p.setName("register-object"); p.setStatus("completed"); p.setRepository("dor"); dao.persistProcess(p); Process p2 = new Process(); p2.setDruid("dr:1234"); p2.setDatastream("GoogleBooksWF"); p2.setName("descriptive-metadata"); p2.setStatus("waiting"); p2.setRepository("dor"); dao.persistProcess(p2); Process p3 = new Process(); p3.setDruid("dr:5678"); p3.setDatastream("GoogleBooksWF"); p3.setName("google-convert"); p3.setStatus("waiting"); p3.setRepository("dor"); dao.persistProcess(p3); } @Test public void findWaitingDruidsByDatastreamAndName() { setupWaitingDruidsByDatastreamAndName(); List<String> druids = dao.findWaitingDruids("dor", "GoogleBooksWF", "descriptive-metadata"); assertEquals(1, druids.size()); assertEquals("dr:1234", druids.get(0)); } @Test public void countWaitingDruidsByDatastreamAndName() { setupWaitingDruidsByDatastreamAndName(); int count = dao.countWaitingDruids("dor", "GoogleBooksWF", "descriptive-metadata"); assertEquals(1, count); } @Test public void findWaitingDruidsWithStatusesOtherThanWaiting() { Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleBooksWF"); p.setName("register-object"); p.setStatus("completed"); p.setRepository("dor"); dao.persistProcess(p); p.setDruid("dr:1234"); p.setDatastream("GoogleBooksWF"); p.setName("register-object"); p.setStatus("completed"); p.setRepository("sdr"); dao.persistProcess(p); Process p2 = new Process(); p2.setDruid("dr:1234"); p2.setDatastream("GoogleBooksWF"); p2.setName("descriptive-metadata"); p2.setStatus("waiting"); p2.setRepository("dor"); dao.persistProcess(p2); Process p3 = new Process(); p3.setDruid("dr:5678"); p3.setDatastream("GoogleBooksWF"); p3.setName("google-convert"); p3.setStatus("waiting"); p3.setRepository("dor"); dao.persistProcess(p3); Process p4 = new Process(); p4.setDruid("dr:4321"); p4.setDatastream("GoogleBooksWF"); p4.setName("descriptive-metadata"); p4.setStatus("INPROCESS"); p4.setRepository("dor"); dao.persistProcess(p4); List<String> druids = dao.findWaitingDruids("dor", "GoogleBooksWF", "descriptive-metadata"); assertEquals(2, druids.size()); assertTrue(druids.contains("dr:1234")); assertTrue(druids.contains("dr:4321")); // Test count query int count = dao.countWaitingDruids("dor", "GoogleBooksWF", "descriptive-metadata"); assertEquals(2, count); } @Test public void findWaitingDruidsByDatastreamNameAndCompleted() { Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleBooksWF"); p.setName("register-object"); p.setStatus("completed"); p.setRepository("dor"); dao.persistProcess(p); Process p2 = new Process(); p2.setDruid("dr:1234"); p2.setDatastream("GoogleBooksWF"); p2.setName("descriptive-metadata"); p2.setStatus("completed"); p2.setRepository("dor"); dao.persistProcess(p2); Process p3 = new Process(); p3.setDruid("dr:1234"); p3.setDatastream("GoogleBooksWF"); p3.setName("google-convert"); p3.setStatus("waiting"); p3.setRepository("dor"); dao.persistProcess(p3); List<String> druids = dao.findWaitingDruidsByDatastreamNameAndCompleted("dor", "GoogleBooksWF", "google-convert", "descriptive-metadata"); assertEquals(1, druids.size()); assertEquals("dr:1234", druids.get(0)); // Test count query assertEquals(1, dao.countWaitingDruidsByDatastreamNameAndCompleted("dor", "GoogleBooksWF", "google-convert", "descriptive-metadata")); } @Test public void findWaitingDruidsByDatastreamNameAndCompletedWithoutWaitingStep() { Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleBooksWF"); p.setName("register-object"); p.setStatus("completed"); p.setRepository("dor"); dao.persistProcess(p); Process p2 = new Process(); p2.setDruid("dr:1234"); p2.setDatastream("GoogleBooksWF"); p2.setName("descriptive-metadata"); p2.setStatus("completed"); p2.setRepository("dor"); dao.persistProcess(p2); Process p3 = new Process(); p3.setDruid("dr:1234"); p3.setDatastream("GoogleBooksWF"); p3.setName("google-convert"); p3.setStatus("waiting"); p3.setRepository("dor"); dao.persistProcess(p3); p2 = new Process(); p2.setDruid("dr:4321"); p2.setDatastream("GoogleBooksWF"); p2.setName("descriptive-metadata"); p2.setStatus("completed"); p2.setRepository("dor"); dao.persistProcess(p2); p3 = new Process(); p3.setDruid("dr:4321"); p3.setDatastream("GoogleBooksWF"); p3.setName("google-convert"); p3.setStatus("INPROCESS"); p3.setRepository("dor"); dao.persistProcess(p3); List<String> druids = dao.findWaitingDruidsByDatastreamNameAndCompleted("dor", "GoogleBooksWF", "google-convert", "descriptive-metadata"); assertEquals(2, druids.size()); assertTrue(druids.contains("dr:1234")); assertTrue(druids.contains("dr:4321")); // Test count query assertEquals(2, dao.countWaitingDruidsByDatastreamNameAndCompleted("dor", "GoogleBooksWF", "google-convert", "descriptive-metadata")); } @Test public void findWaitingDruidsByDatastreamNameAndCompletedWithoutWaitingStepIgnoringQueued() { Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleBooksWF"); p.setName("register-object"); p.setStatus("completed"); p.setRepository("dor"); dao.persistProcess(p); Process p2 = new Process(); p2.setDruid("dr:1234"); p2.setDatastream("GoogleBooksWF"); p2.setName("descriptive-metadata"); p2.setStatus("completed"); p2.setRepository("dor"); dao.persistProcess(p2); Process p3 = new Process(); p3.setDruid("dr:1234"); p3.setDatastream("GoogleBooksWF"); p3.setName("google-convert"); p3.setStatus("waiting"); p3.setRepository("dor"); dao.persistProcess(p3); p2 = new Process(); p2.setDruid("dr:4321"); p2.setDatastream("GoogleBooksWF"); p2.setName("descriptive-metadata"); p2.setStatus("completed"); p2.setRepository("dor"); dao.persistProcess(p2); p3 = new Process(); p3.setDruid("dr:4321"); p3.setDatastream("GoogleBooksWF"); p3.setName("google-convert"); p3.setStatus("INPROCESS"); p3.setRepository("dor"); dao.persistProcess(p3); //This druid should not show up in the query results p2 = new Process(); p2.setDruid("dr:5678"); p2.setDatastream("GoogleBooksWF"); p2.setName("descriptive-metadata"); p2.setStatus("completed"); p2.setRepository("dor"); dao.persistProcess(p2); p3 = new Process(); p3.setDruid("dr:5678"); p3.setDatastream("GoogleBooksWF"); p3.setName("google-convert"); p3.setStatus("queued"); p3.setRepository("dor"); dao.persistProcess(p3); List<String> druids = dao.findWaitingDruidsByDatastreamNameAndCompleted("dor", "GoogleBooksWF", "google-convert", "descriptive-metadata"); assertEquals(2, druids.size()); assertTrue(druids.contains("dr:1234")); assertTrue(druids.contains("dr:4321")); // Test count query assertEquals(2, dao.countWaitingDruidsByDatastreamNameAndCompleted("dor", "GoogleBooksWF", "google-convert", "descriptive-metadata")); } @Test public void findWaitingProcessWithTwoCompletedSteps() { createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "ingest", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "shelve", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "cleanup", "waiting"); List<String> druids = dao.findWaitingDruidsWithTwoCompletedProcesses("dor", "googleScannedBookWF", "cleanup", "ingest", "shelve"); assertEquals(1, druids.size()); assertEquals("dr:1234", druids.get(0)); // Test count query assertEquals(1, dao.countWaitingDruidsWithTwoCompletedProcesses("dor", "googleScannedBookWF", "cleanup", "ingest", "shelve")); } @Test public void findWaitingProcessWithTwoCompletedStepsAndNoProcessWithStatusOfWaiting() { createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "ingest", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "shelve", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "cleanup", "waiting"); createAndPersistProcess("dor", "dr:4321", "googleScannedBookWF", "ingest", "completed"); createAndPersistProcess("dor", "dr:4321", "googleScannedBookWF", "shelve", "completed"); createAndPersistProcess("dor", "dr:4321", "googleScannedBookWF", "cleanup", "WORKING_ON_IT"); List<String> druids = dao.findWaitingDruidsWithTwoCompletedProcesses("dor", "googleScannedBookWF", "cleanup", "ingest", "shelve"); assertEquals(2, druids.size()); assertTrue(druids.contains("dr:1234")); assertTrue(druids.contains("dr:4321")); // Test count query assertEquals(2, dao.countWaitingDruidsWithTwoCompletedProcesses("dor", "googleScannedBookWF", "cleanup", "ingest", "shelve")); } @Test public void findWaitingProcessWithTwoCompletedStepsAndDoNotCountQueued() { createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "ingest", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "shelve", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "cleanup", "waiting"); createAndPersistProcess("dor", "dr:4321", "googleScannedBookWF", "ingest", "completed"); createAndPersistProcess("dor", "dr:4321", "googleScannedBookWF", "shelve", "completed"); createAndPersistProcess("dor", "dr:4321", "googleScannedBookWF", "cleanup", "WORKING_ON_IT"); //This druid should not show up in the query results createAndPersistProcess("dor", "dr:6789", "googleScannedBookWF", "ingest", "completed"); createAndPersistProcess("dor", "dr:6789", "googleScannedBookWF", "shelve", "completed"); createAndPersistProcess("dor", "dr:6789", "googleScannedBookWF", "cleanup", "queued"); List<String> druids = dao.findWaitingDruidsWithTwoCompletedProcesses("dor", "googleScannedBookWF", "cleanup", "ingest", "shelve"); assertEquals(2, druids.size()); assertTrue(druids.contains("dr:1234")); assertTrue(druids.contains("dr:4321")); // Test count query assertEquals(2, dao.countWaitingDruidsWithTwoCompletedProcesses("dor", "googleScannedBookWF", "cleanup", "ingest", "shelve")); } @Test public void findWaitingProcessWithTwoCompletedStepsAndAllStepsComplete() { createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "ingest", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "shelve", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "cleanup", "completed"); createAndPersistProcess("dor", "dr:4321", "googleScannedBookWF", "ingest", "completed"); createAndPersistProcess("dor", "dr:4321", "googleScannedBookWF", "shelve", "completed"); createAndPersistProcess("dor", "dr:4321", "googleScannedBookWF", "cleanup", "completed"); List<String> druids = dao.findWaitingDruidsWithTwoCompletedProcesses("dor", "googleScannedBookWF", "cleanup", "ingest", "shelve"); assertEquals(0, druids.size()); // Test count query assertEquals(0, dao.countWaitingDruidsWithTwoCompletedProcesses("dor", "googleScannedBookWF", "cleanup", "ingest", "shelve")); } @Test public void findCompletedDruids() { createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "register-object", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "descriptive-metadata", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "google-convert", "waiting"); List<String> druids = dao.findCompletedDruids("dor", "googleScannedBookWF", "register-object"); assertEquals(1, druids.size()); assertEquals("dr:1234", druids.get(0)); // Test count query assertEquals(1, dao.countCompletedDruids("dor", "googleScannedBookWF", "register-object")); } @Test public void findQueuedDruids() { createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "register-object", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "descriptive-metadata", "completed"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "process-content", "queued"); createAndPersistProcess("dor", "dr:3456", "googleScannedBookWF", "process-content", "queued"); List<String> druids = dao.findQueuedDruids("dor", "googleScannedBookWF", "process-content"); assertEquals(2, druids.size()); assertTrue(druids.contains("dr:1234")); assertTrue(druids.contains("dr:3456")); // Test count query assertEquals(2, dao.countQueuedDruids("dor", "googleScannedBookWF", "process-content")); } @Test public void findErrorDruids() { Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleBooksWF"); p.setName("register-object"); p.setStatus("completed"); p.setRepository("dor"); dao.persistProcess(p); Process p2 = new Process(); p2.setDruid("dr:1234"); p2.setDatastream("GoogleBooksWF"); p2.setName("descriptive-metadata"); p2.setStatus("completed"); p2.setRepository("dor"); dao.persistProcess(p2); Process p3 = new Process(); p3.setDruid("dr:1234"); p3.setDatastream("GoogleBooksWF"); p3.setName("google-convert"); p3.setStatus("waiting"); p3.setRepository("dor"); dao.persistProcess(p3); Process p4 = new Process(); p4.setDruid("dr:1234"); p4.setDatastream("GoogleBooksWF"); p4.setName("ingest"); p4.setStatus("error"); p4.setRepository("dor"); dao.persistProcess(p4); p4 = new Process(); p4.setDruid("dr:6789"); p4.setDatastream("GoogleBooksWF"); p4.setName("ingest"); p4.setStatus("error"); p4.setRepository("dor"); dao.persistProcess(p4); List<Process> procs = dao.findErrorProcessesByDatastreamAndName("dor", "GoogleBooksWF", "ingest"); assertEquals(2, procs.size()); HashSet<String> druids = new HashSet<String>(); for(Process proc: procs){ druids.add(proc.getDruid()); } assertTrue(druids.contains("dr:1234")); assertTrue(druids.contains("dr:6789")); // Test count method int count = dao.countErrorProcessesByDatastreamAndName("dor", "GoogleBooksWF", "ingest"); assertEquals(2, count); } @Test public void findNoErrorDruids() { Process p = new Process(); p.setDruid("dr:1234"); p.setDatastream("GoogleBooksWF"); p.setName("register-object"); p.setStatus("completed"); p.setRepository("dor"); dao.persistProcess(p); List<Process> procs = dao.findErrorProcessesByDatastreamAndName("dor", "GoogleBooksWF", "ingest"); assertEquals(0, procs.size()); // Test count method int count = dao.countErrorProcessesByDatastreamAndName("dor", "GoogleBooksWF", "ingest"); assertEquals(0, count); } @Test public void findCompletedLifecycleSteps() { createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "ingest", "completed", "archived"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "shelve", "completed", "released"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "index", "waiting"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "cleanup","waiting", "accessioned"); List<Process> procs = dao.findLifecycleCompletedProcesses("dor", "dr:1234"); assertEquals(2, procs.size()); assertEquals("dr:1234", procs.get(0).getDruid()); assertEquals("archived", procs.get(0).getLifecycle()); assertEquals("released", procs.get(1).getLifecycle()); } @Test public void findNoLifecycleSteps() { createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "ingest", "waiting", "archived"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "shelve", "waiting", "released"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "index", "waiting"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "cleanup","waiting", "accessioned"); List<Process> procs = dao.findLifecycleCompletedProcesses("dor", "dr:1234"); assertEquals(0, procs.size()); } // The WorkflowService.delete method should only delete the named workflow (datastream column) @Test public void deleteOnlyWorkflowThatIsSpecified() { createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "ingest", "completed", "archived"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "shelve", "completed", "released"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "index", "waiting"); createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "cleanup","waiting", "accessioned"); createAndPersistProcess("dor", "dr:1234", "etdAccessionWF", "pre-register","waiting", "accessioned"); dao.deleteProcessesByRepoDruidAndWorkflowName("dor", "dr:1234", "etdAccessionWF"); List<Process> procs = dao.findProcessesByDruidAndDatastream("dor", "dr:1234", "googleScannedBookWF"); assertEquals(4, procs.size()); procs = dao.findProcessesByDruidAndDatastream("dor", "dr:1234", "etdAccessionWF"); assertEquals(0, procs.size()); } }