package dk.statsbiblioteket.medieplatform.autonomous; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.XMLUnit; import org.testng.Assert; import org.testng.annotations.Test; import javax.xml.bind.JAXBException; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.util.Date; import java.util.List; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; public class PremisManipulatorTest { public static final String ITEM_ID = "B400022028241-RT1"; public static final int ONE_DAY_IN_MS = 24 * 60 * 60 * 1000; @Test public void testCreateInitialPremisBlob() throws Exception { PremisManipulatorFactory<Item> factory = new PremisManipulatorFactory<>(PremisManipulatorFactory.TYPE, new DomsItemFactory()); PremisManipulator<Item> manipulator = factory.createInitialPremisBlob(ITEM_ID); String blobString = manipulator.toXML(); StringReader test = new StringReader(blobString); Reader control = new InputStreamReader(getFile("objectOnlyBlob.xml")); XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreComments(true); Diff diff = XMLUnit.compareXML(control, test); if (!diff.identical()) { System.out.println(diff.toString()); } Assert.assertTrue(diff.similar()); //Assert.assertTrue(diff.identical()); } @Test public void testAddEvent() throws Exception { PremisManipulatorFactory<Item> factory = new PremisManipulatorFactory<>(PremisManipulatorFactory.TYPE, new DomsItemFactory()); PremisManipulator<Item> manipulator = factory.createInitialPremisBlob(ITEM_ID); Date date = new Date(ONE_DAY_IN_MS); manipulator = manipulator.appendEvent("batch_uploaded_trigger", date, "details here", "Data_Received", true); StringReader test = new StringReader(manipulator.toXML()); Reader control = new InputStreamReader(getFile("eventAddedBlob.xml")); XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreComments(true); Diff diff = XMLUnit.compareXML(control, test); if (!diff.identical()) { System.out.println(manipulator.toXML()); System.out.println(diff.toString()); } Assert.assertTrue(diff.similar()); //Assert.assertTrue(diff.identical()); } @Test public void testAddEventToHead() throws Exception { PremisManipulatorFactory<Item> factory = new PremisManipulatorFactory<>(PremisManipulatorFactory.TYPE, new DomsItemFactory()); PremisManipulator<Item> manipulator = factory.createInitialPremisBlob(ITEM_ID); Date date = new Date(ONE_DAY_IN_MS); manipulator = manipulator.appendEvent("batch_uploaded_trigger", date, "details here", "Data_Received", true); StringReader test = new StringReader(manipulator.toXML()); Reader control = new InputStreamReader(getFile("eventAddedBlob.xml")); XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreComments(true); Diff diff = XMLUnit.compareXML(control, test); if (!diff.identical()) { System.out.println(manipulator.toXML()); System.out.println(diff.toString()); } Assert.assertTrue(diff.similar()); Date headDate = new Date(0); manipulator = manipulator.prependEvent("roundtrip_prioritizer", headDate, "details here", "Prioritized", true); StringReader testHead = new StringReader(manipulator.toXML()); Reader control2 = new InputStreamReader(getFile("eventAndPriorityAddedBlob.xml")); XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreComments(true); Diff diff2 = XMLUnit.compareXML(control2, testHead); if (!diff2.identical()) { System.out.println(manipulator.toXML()); System.out.println(diff2.toString()); } Assert.assertTrue(diff2.similar()); } @Test public void testAddEventToHeadSequence() throws Exception { PremisManipulatorFactory<Item> factory = new PremisManipulatorFactory<>(PremisManipulatorFactory.TYPE, new DomsItemFactory()); PremisManipulator<Item> normalEventFirst = factory.createInitialPremisBlob(ITEM_ID); PremisManipulator<Item> headEventFirst = factory.createInitialPremisBlob(ITEM_ID); Date normalEventdate = new Date(ONE_DAY_IN_MS); Date headEventDate = new Date(0); normalEventFirst = normalEventFirst.appendEvent("batch_uploaded_trigger", normalEventdate, "details here", "Data_Received", true); normalEventFirst = normalEventFirst.prependEvent("roundtrip_prioritizer", headEventDate, "details here", "Prioritized", true); headEventFirst = headEventFirst.prependEvent("roundtrip_prioritizer", headEventDate, "details here", "Prioritized", true); headEventFirst = headEventFirst.appendEvent("batch_uploaded_trigger", normalEventdate, "details here", "Data_Received", true); List<Event> normalEventFirstEvents = normalEventFirst.toItem().getEventList(); List<Event> headEventFirstEvents = headEventFirst.toItem().getEventList(); Assert.assertEquals(normalEventFirstEvents, headEventFirstEvents); } private InputStream getFile(String file) { return Thread.currentThread().getContextClassLoader().getResourceAsStream(file); } @Test public void testGetAsBatch() throws Exception { PremisManipulatorFactory<Item> factory = new PremisManipulatorFactory<>(PremisManipulatorFactory.TYPE, new DomsItemFactory()); PremisManipulator<Item> premisBlob = factory.createFromBlob(getFile("eventAddedBlob.xml")); Item batch = premisBlob.toItem(); Assert.assertEquals("B400022028241-RT1", batch.getFullID()); List<Event> events = batch.getEventList(); for (Event event : events) { Assert.assertTrue(event.isSuccess()); Assert.assertEquals(event.getDetails(), "details here"); Assert.assertEquals(event.getEventID(), "Data_Received"); } } /** * Adds a bunch of events to a PREMIS blob. Remove all events after the first failure and check that they are * actually removed. Also check (somewhat redundantly) that the resultant blob can still be parsed as Premis. * Finally there is an idempotence test that a further call to remove failures has no effect. * * @throws JAXBException */ @Test public void testRemoveEventsAfterFailure() throws JAXBException { PremisManipulatorFactory<Item> factory = new PremisManipulatorFactory<>(PremisManipulatorFactory.TYPE, new DomsItemFactory()); PremisManipulator<Item> manipulator = factory.createInitialPremisBlob(ITEM_ID); manipulator = manipulator.appendEvent("me", new Date(100), "details here", "e1", true); manipulator = manipulator.appendEvent("me", new Date(200), "details here", "e2", true); manipulator = manipulator.appendEvent("me", new Date(300), "details here", "e3", false); manipulator = manipulator.appendEvent("me", new Date(400), "details here", "e4", true); manipulator = manipulator.appendEvent("me", new Date(500), "details here", "e5", true); manipulator = manipulator.appendEvent("me", new Date(600), "details here", "e6", false); manipulator = manipulator.appendEvent("me", new Date(700), "details here", "e7", true); manipulator = manipulator.appendEvent("me", new Date(800), "details here", "e8", true); assertTrue(manipulator.toXML().contains("e7")); manipulator.removeEventsFromFailureOrEvent(null); String newXml = manipulator.toXML(); assertTrue(newXml.contains("e1")); assertTrue(newXml.contains("e2")); assertFalse(newXml.contains("e3")); assertFalse(newXml.contains("e4")); assertFalse(newXml.contains("e5")); assertFalse(newXml.contains("e6")); assertFalse(newXml.contains("e7")); assertFalse(newXml.contains("e8")); factory.createFromBlob(new ByteArrayInputStream(newXml.getBytes())); manipulator.removeEventsFromFailureOrEvent(null); String evenNewerXml = manipulator.toXML(); assertEquals(newXml, evenNewerXml); } /** * Adds a bunch of events to a PREMIS blob. Remove all events after the first failure and check that they are * actually removed. Also check (somewhat redundantly) that the resultant blob can still be parsed as Premis. * Finally there is an idempotence test that a further call to remove failures has no effect. * * @throws JAXBException */ @Test public void testRemoveEventsAfterNamedEvent() throws JAXBException { PremisManipulatorFactory<Item> factory = new PremisManipulatorFactory<>(PremisManipulatorFactory.TYPE, new DomsItemFactory()); PremisManipulator<Item> manipulator = factory.createInitialPremisBlob(ITEM_ID); manipulator = manipulator.appendEvent("me", new Date(100), "details here", "e1", true); manipulator = manipulator.appendEvent("me", new Date(200), "details here", "e2", true); manipulator = manipulator.appendEvent("me", new Date(300), "details here", "e3", false); manipulator = manipulator.appendEvent("me", new Date(400), "details here", "e4", true); manipulator = manipulator.appendEvent("me", new Date(500), "details here", "e5", true); manipulator = manipulator.appendEvent("me", new Date(600), "details here", "e6", false); manipulator = manipulator.appendEvent("me", new Date(700), "details here", "e7", true); manipulator = manipulator.appendEvent("me", new Date(800), "details here", "e8", true); assertTrue(manipulator.toXML().contains("e7")); int eventsRemoved = manipulator.removeEventsFromFailureOrEvent("e5"); assertEquals(eventsRemoved, 4); String newXml = manipulator.toXML(); assertTrue(newXml.contains("e1")); assertTrue(newXml.contains("e2")); assertTrue(newXml.contains("e3")); assertTrue(newXml.contains("e4")); assertFalse(newXml.contains("e5")); assertFalse(newXml.contains("e6")); assertFalse(newXml.contains("e7")); assertFalse(newXml.contains("e8")); factory.createFromBlob(new ByteArrayInputStream(newXml.getBytes())); eventsRemoved = manipulator.removeEventsFromFailureOrEvent("e5"); assertEquals(eventsRemoved, 0); String evenNewerXml = manipulator.toXML(); assertEquals(newXml, evenNewerXml); } /** * Adds a bunch of events to a PREMIS blob. Remove all events after the first failure and check that they are * actually removed. Also check (somewhat redundantly) that the resultant blob can still be parsed as Premis. * Finally there is an idempotence test that a further call to remove failures has no effect. * * @throws JAXBException */ @Test public void testRemoveNamedEvent() throws JAXBException { PremisManipulatorFactory<Item> factory = new PremisManipulatorFactory<>(PremisManipulatorFactory.TYPE, new DomsItemFactory()); PremisManipulator<Item> manipulator = factory.createInitialPremisBlob(ITEM_ID); manipulator = manipulator.appendEvent("me", new Date(100), "details here", "e1", true); manipulator = manipulator.appendEvent("me", new Date(200), "details here", "e2", true); manipulator = manipulator.appendEvent("me", new Date(300), "details here", "e2", false); manipulator = manipulator.appendEvent("me", new Date(400), "details here", "e4", true); manipulator = manipulator.appendEvent("me", new Date(500), "details here", "e2", true); manipulator = manipulator.appendEvent("me", new Date(600), "details here", "e3", false); manipulator = manipulator.appendEvent("me", new Date(700), "details here", "e3", true); manipulator = manipulator.appendEvent("me", new Date(800), "details here", "e1", true); assertTrue(manipulator.toXML().contains("e1")); int eventsRemoved = manipulator.removeEvents("e1"); assertEquals(eventsRemoved, 2); String newXml = manipulator.toXML(); assertFalse(newXml.contains("e1")); assertTrue(newXml.contains("e2")); assertTrue(newXml.contains("e3")); assertTrue(newXml.contains("e4")); factory.createFromBlob(new ByteArrayInputStream(newXml.getBytes())); eventsRemoved = manipulator.removeEvents("e4"); assertEquals(eventsRemoved, 1); newXml = manipulator.toXML(); assertFalse(newXml.contains("e4")); eventsRemoved = manipulator.removeEvents("e5"); assertEquals(eventsRemoved, 0); String evenNewerXml = manipulator.toXML(); assertEquals(newXml, evenNewerXml); } @Test public void testNoDetails() throws JAXBException { PremisManipulatorFactory<Item> factory = new PremisManipulatorFactory<>(PremisManipulatorFactory.TYPE, new DomsItemFactory()); try { PremisManipulator<Item> premisBlob = factory.createFromBlob(getFile("EventNoDetails.xml")); } catch (Exception e) { fail("Failed to read premis without details", e); } } }