diff --git a/bitrepository-alarm-service/pom.xml b/bitrepository-alarm-service/pom.xml index 5236679fc..504188cac 100644 --- a/bitrepository-alarm-service/pom.xml +++ b/bitrepository-alarm-service/pom.xml @@ -14,41 +14,29 @@ - javax - javaee-web-api - ${javaee.web.version} - provided - - - javax.servlet - javax.servlet-api - ${javax.servlet.version} + jakarta.servlet + jakarta.servlet-api provided org.apache.cxf cxf-rt-transports-http - ${cxf.version} org.apache.cxf cxf-rt-rs-client - ${cxf.version} com.fasterxml.jackson.core jackson-databind - ${jackson.version} - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson.version} + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider jakarta.ws.rs jakarta.ws.rs-api - ${jakarta.ws.rs.version} org.bitrepository.reference @@ -58,7 +46,6 @@ javax.mail javax.mail-api - 1.6.2 org.bitrepository.reference @@ -83,7 +70,16 @@ org.apache.activemq artemis-server - ${artemis.version} + test + + + org.testcontainers + testcontainers-junit-jupiter + test + + + org.testcontainers + testcontainers-postgresql test @@ -94,11 +90,6 @@ io.qameta.allure allure-maven - 2.12.0 - - ${project.build.directory}/allure-results - ${project.build.directory}/allure-report - maven-assembly-plugin diff --git a/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/AlarmServiceInput.java b/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/AlarmServiceInput.java index a2fca633f..9890a94c8 100644 --- a/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/AlarmServiceInput.java +++ b/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/AlarmServiceInput.java @@ -21,7 +21,7 @@ */ package org.bitrepository.alarm.alarmservice; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class AlarmServiceInput { diff --git a/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/AlarmServiceRestApplication.java b/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/AlarmServiceRestApplication.java index cda3574e6..388e34b81 100644 --- a/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/AlarmServiceRestApplication.java +++ b/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/AlarmServiceRestApplication.java @@ -1,8 +1,8 @@ package org.bitrepository.alarm.alarmservice; -import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; -import javax.ws.rs.core.Application; +import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider; +import jakarta.ws.rs.core.Application; import java.util.Arrays; import java.util.HashSet; import java.util.Set; diff --git a/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/RestAlarmService.java b/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/RestAlarmService.java index 9a7b3fc49..550678516 100644 --- a/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/RestAlarmService.java +++ b/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/RestAlarmService.java @@ -30,13 +30,13 @@ import org.bitrepository.bitrepositoryelements.AlarmCode; import org.bitrepository.common.utils.CalendarUtils; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.FormParam; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.FormParam; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; import java.time.Instant; import java.time.ZoneId; import java.util.ArrayList; diff --git a/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/WebAlarm.java b/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/WebAlarm.java index 6ace8714f..dd2fc7e51 100644 --- a/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/WebAlarm.java +++ b/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/alarmservice/WebAlarm.java @@ -26,8 +26,8 @@ import org.bitrepository.common.utils.CalendarUtils; import org.bitrepository.common.utils.TimeUtils; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; /** * Class to format alarms for web display diff --git a/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/store/AlarmDatabaseExtractor.java b/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/store/AlarmDatabaseExtractor.java index 888749c48..57e1a0bd7 100644 --- a/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/store/AlarmDatabaseExtractor.java +++ b/bitrepository-alarm-service/src/main/java/org/bitrepository/alarm/store/AlarmDatabaseExtractor.java @@ -206,12 +206,12 @@ private String createRestriction() { res.append(ALARM_CODE + " = ?"); } - if (model.getStartDate() != null) { + if (model.getStart() != null) { nextArgument(res); res.append(ALARM_DATE + " >= ?"); } - if (model.getEndDate() != null) { + if (model.getEnd() != null) { nextArgument(res); res.append(ALARM_DATE + " <= ?"); } @@ -258,12 +258,12 @@ private Object[] extractArgumentsFromModel() { res.add(model.getAlarmCode().toString()); } - if (model.getStartDate() != null) { - res.add(model.getStartDate().getTime()); + if (model.getStart() != null) { + res.add(model.getStart().toEpochMilli()); } - if (model.getEndDate() != null) { - res.add(model.getEndDate().getTime()); + if (model.getEnd() != null) { + res.add(model.getEnd().toEpochMilli()); } if (model.getFileID() != null) { diff --git a/bitrepository-alarm-service/src/main/webapp/WEB-INF/web.xml b/bitrepository-alarm-service/src/main/webapp/WEB-INF/web.xml index cb34a6e48..d07fc1232 100644 --- a/bitrepository-alarm-service/src/main/webapp/WEB-INF/web.xml +++ b/bitrepository-alarm-service/src/main/webapp/WEB-INF/web.xml @@ -32,7 +32,7 @@ Bitrepository-alarmservice org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet - javax.ws.rs.Application + jakarta.ws.rs.Application org.bitrepository.alarm.alarmservice.AlarmServiceRestApplication 1 diff --git a/bitrepository-alarm-service/src/test/java/org/bitrepository/alarm/handler/AlarmHandlerTest.java b/bitrepository-alarm-service/src/test/java/org/bitrepository/alarm/handler/AlarmHandlerIT.java similarity index 98% rename from bitrepository-alarm-service/src/test/java/org/bitrepository/alarm/handler/AlarmHandlerTest.java rename to bitrepository-alarm-service/src/test/java/org/bitrepository/alarm/handler/AlarmHandlerIT.java index f773926cf..db1482c9e 100644 --- a/bitrepository-alarm-service/src/test/java/org/bitrepository/alarm/handler/AlarmHandlerTest.java +++ b/bitrepository-alarm-service/src/test/java/org/bitrepository/alarm/handler/AlarmHandlerIT.java @@ -36,7 +36,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @ExtendWith(SuiteInfoParameterResolver.class) -public class AlarmHandlerTest extends IntegrationTest { +public class AlarmHandlerIT extends IntegrationTest { @Test @Tag("regressiontest") public void alarmMediatorTest() throws Exception { diff --git a/bitrepository-alarm-service/src/test/java/org/bitrepository/alarm/store/AlarmDatabaseTest.java b/bitrepository-alarm-service/src/test/java/org/bitrepository/alarm/store/AlarmDatabaseTest.java index 791bd58c0..ce6f807e4 100644 --- a/bitrepository-alarm-service/src/test/java/org/bitrepository/alarm/store/AlarmDatabaseTest.java +++ b/bitrepository-alarm-service/src/test/java/org/bitrepository/alarm/store/AlarmDatabaseTest.java @@ -26,19 +26,19 @@ import org.bitrepository.common.settings.Settings; import org.bitrepository.common.settings.TestSettingsProvider; import org.bitrepository.common.utils.CalendarUtils; -import org.bitrepository.common.utils.FileUtils; import org.bitrepository.service.database.DBConnector; import org.bitrepository.service.database.DatabaseUtils; -import org.bitrepository.service.database.DerbyDatabaseDestroyer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; +import org.testcontainers.containers.BindMode; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; -import java.io.File; import java.time.Instant; import java.time.OffsetDateTime; import java.util.ArrayList; @@ -50,7 +50,7 @@ /** * Sees if alarms are correctly stored in the database. */ -@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@Testcontainers class AlarmDatabaseTest { /** * The settings for the tests. Should be instantiated in the setup. @@ -62,19 +62,23 @@ class AlarmDatabaseTest { String collection1 = "collection1"; String collection2 = "collection2"; String DATABASE_NAME = "alarmservicedb"; - String DATABASE_DIRECTORY = "test-data"; - String DATABASE_URL = "jdbc:derby:" + DATABASE_DIRECTORY + "/" + DATABASE_NAME; - File dbDir = null; - @BeforeAll + @Container + PostgreSQLContainer postgreSQLContainer = + new PostgreSQLContainer("postgres:18-alpine") + .withDatabaseName(DATABASE_NAME) + .withClasspathResourceMapping("sql/postgres/alarmServiceDBCreation.sql", + "/docker-entrypoint-initdb.d/init.sql", + BindMode.READ_ONLY); + + @BeforeEach void setup() { settings = TestSettingsProvider.reloadSettings("AlarmDatabaseUnderTest"); - - DerbyDatabaseDestroyer.deleteDatabase( - settings.getReferenceSettings().getAlarmServiceSettings().getAlarmServiceDatabase()); - - AlarmDatabaseCreator integrityDatabaseCreator = new AlarmDatabaseCreator(); - integrityDatabaseCreator.createAlarmDatabase(settings, null); + var alarmServiceDatabaseSettings = settings.getReferenceSettings().getAlarmServiceSettings().getAlarmServiceDatabase(); + alarmServiceDatabaseSettings.setDatabaseURL(postgreSQLContainer.getJdbcUrl()); + alarmServiceDatabaseSettings.setUsername(postgreSQLContainer.getUsername()); + alarmServiceDatabaseSettings.setPassword(postgreSQLContainer.getPassword()); + alarmServiceDatabaseSettings.setDriverClass(postgreSQLContainer.getDriverClassName()); } @AfterEach @@ -86,11 +90,8 @@ void cleanupDatabase() { } @AfterAll - void shutdown() { + static void shutdown() { addStep("Cleanup after test.", "Should remove directory with test material."); - if (dbDir != null) { - FileUtils.delete(dbDir); - } } @Test diff --git a/bitrepository-audit-trail-service/pom.xml b/bitrepository-audit-trail-service/pom.xml index 55ef494e7..0dc8e3e87 100644 --- a/bitrepository-audit-trail-service/pom.xml +++ b/bitrepository-audit-trail-service/pom.xml @@ -25,38 +25,26 @@ org.apache.cxf cxf-rt-transports-http - ${cxf.version} org.apache.cxf cxf-rt-rs-client - ${cxf.version} com.fasterxml.jackson.core jackson-databind - ${jackson.version} - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson.version} + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider jakarta.ws.rs jakarta.ws.rs-api - ${jakarta.ws.rs.version} - javax - javaee-web-api - ${javaee.web.version} - provided - - - javax.servlet - javax.servlet-api - ${javax.servlet.version} + jakarta.servlet + jakarta.servlet-api provided @@ -82,9 +70,18 @@ org.apache.activemq artemis-server - ${artemis.version} test + + org.testcontainers + testcontainers-junit-jupiter + test + + + org.testcontainers + testcontainers-postgresql + test + @@ -92,11 +89,6 @@ io.qameta.allure allure-maven - 2.12.0 - - ${project.basedir}/allure-results - ${project.basedir}/allure-report - maven-assembly-plugin diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/AuditTrailServiceRestApplication.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/AuditTrailServiceRestApplication.java index eef6580ad..25fd1b86e 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/AuditTrailServiceRestApplication.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/AuditTrailServiceRestApplication.java @@ -1,8 +1,8 @@ package org.bitrepository.audittrails.webservice; -import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; -import javax.ws.rs.core.Application; +import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider; +import jakarta.ws.rs.core.Application; import java.util.Arrays; import java.util.HashSet; import java.util.Set; diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/CollectorInfo.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/CollectorInfo.java index 63c50fb29..05f5e54f7 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/CollectorInfo.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/CollectorInfo.java @@ -21,7 +21,7 @@ */ package org.bitrepository.audittrails.webservice; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class CollectorInfo { diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/PreservationInfo.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/PreservationInfo.java index cda437c92..000635f1c 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/PreservationInfo.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/PreservationInfo.java @@ -1,6 +1,6 @@ package org.bitrepository.audittrails.webservice; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class PreservationInfo { diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java index 0282c967c..cc881a922 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/webservice/RestAuditTrailService.java @@ -37,18 +37,18 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.FormParam; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.FormParam; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; import java.io.IOException; import java.sql.SQLException; import java.time.Instant; @@ -85,8 +85,8 @@ public StreamingOutput queryAuditTrailEvents(@FormParam("fromDate") String fromD final int maxAudits = maxResults; final AuditEventIterator it = service.queryAuditTrailEventsByIterator( - from != null ? from : null, - to != null ? to : null, + from, + to, contentOrNull(fileID), collectionID, contentOrNull(reportingComponent), contentOrNull(actor), filterAction(action), contentOrNull(fingerprint), contentOrNull(operationID), maxAudits); diff --git a/bitrepository-audit-trail-service/src/main/webapp/WEB-INF/web.xml b/bitrepository-audit-trail-service/src/main/webapp/WEB-INF/web.xml index 23ddd4bfa..72536a131 100644 --- a/bitrepository-audit-trail-service/src/main/webapp/WEB-INF/web.xml +++ b/bitrepository-audit-trail-service/src/main/webapp/WEB-INF/web.xml @@ -34,7 +34,7 @@ Audit-Trails org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet - javax.ws.rs.Application + jakarta.ws.rs.Application org.bitrepository.audittrails.webservice.AuditTrailServiceRestApplication 1 diff --git a/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/collector/IncrementalCollectorTest.java b/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/collector/IncrementalCollectorTest.java index 9dbbb767c..6a7680003 100644 --- a/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/collector/IncrementalCollectorTest.java +++ b/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/collector/IncrementalCollectorTest.java @@ -255,7 +255,7 @@ void contributorFailureTest() throws Exception { verify(store, timeout(3000).times(1)) .addAuditTrails(any(AuditTrailEvents.class), eq(TEST_COLLECTION), eq(TEST_CONTRIBUTOR2)); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "")); Assertions.assertFalse(collectionRunner.finished, "The collector should not have finished after the complete event, as partialResults where received"); diff --git a/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/store/AuditDatabaseTest.java b/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/store/AuditDatabaseTest.java index f89b95a43..bf8bc16eb 100644 --- a/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/store/AuditDatabaseTest.java +++ b/bitrepository-audit-trail-service/src/test/java/org/bitrepository/audittrails/store/AuditDatabaseTest.java @@ -28,11 +28,14 @@ import org.bitrepository.common.settings.TestSettingsProvider; import org.bitrepository.common.utils.CalendarUtils; import org.bitrepository.service.database.DatabaseManager; -import org.bitrepository.service.database.DerbyDatabaseDestroyer; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.testcontainers.containers.BindMode; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import java.math.BigInteger; import java.time.Instant; @@ -43,8 +46,9 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; +@Testcontainers class AuditDatabaseTest { - /** The settings for the tests. Should be instantiated in the setup.*/ + /** The settings for the tests. Should be instantiated in the setup. */ Settings settings; String fileID = "TEST-FILE-ID-" + Instant.now().toEpochMilli(); String fileID2 = "ANOTHER-FILE-ID" + Instant.now().toEpochMilli(); @@ -57,16 +61,25 @@ class AuditDatabaseTest { static final String fingerprint2 = "baba"; static final String operationID2 = "4321"; + @Container + PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:18-alpine") + .withLogConsumer(log -> System.out.println(log.getUtf8StringWithoutLineEnding())) + .withClasspathResourceMapping( + "sql/postgres/auditTrailServiceDBCreation.sql", + "/docker-entrypoint-initdb.d/init.sql", + BindMode.READ_ONLY); + + @BeforeEach void setup() throws Exception { settings = TestSettingsProvider.reloadSettings("AuditDatabaseUnderTest"); - DerbyDatabaseDestroyer.deleteDatabase( - settings.getReferenceSettings().getAuditTrailServiceSettings().getAuditTrailServiceDatabase()); - - AuditTrailDatabaseCreator auditTrailDatabaseCreator = new AuditTrailDatabaseCreator(); - auditTrailDatabaseCreator.createAuditTrailDatabase(settings, null); - collectionID = settings.getCollections().get(0).getID(); + + var dbsettings = settings.getReferenceSettings().getAuditTrailServiceSettings().getAuditTrailServiceDatabase(); + dbsettings.setDatabaseURL(postgreSQLContainer.getJdbcUrl()); + dbsettings.setUsername(postgreSQLContainer.getUsername()); + dbsettings.setPassword(postgreSQLContainer.getPassword()); + dbsettings.setDriverClass(postgreSQLContainer.getDriverClassName()); } @Test diff --git a/bitrepository-client/pom.xml b/bitrepository-client/pom.xml index 7bd08a9d1..9242eebc7 100644 --- a/bitrepository-client/pom.xml +++ b/bitrepository-client/pom.xml @@ -19,7 +19,6 @@ commons-cli commons-cli - 1.4 @@ -30,11 +29,20 @@ test - org.apache.activemq + org.apache.artemis artemis-server - ${artemis.version} test + + org.testcontainers + testcontainers-junit-jupiter + test + + + org.testcontainers + testcontainers-activemq + test + @@ -42,11 +50,6 @@ io.qameta.allure allure-maven - 2.12.0 - - ${project.basedir}/allure-results - ${project.basedir}/allure-report - maven-assembly-plugin diff --git a/bitrepository-client/src/main/java/org/bitrepository/access/getchecksums/conversation/GettingChecksums.java b/bitrepository-client/src/main/java/org/bitrepository/access/getchecksums/conversation/GettingChecksums.java index 1bbb52c33..e15a8b413 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/access/getchecksums/conversation/GettingChecksums.java +++ b/bitrepository-client/src/main/java/org/bitrepository/access/getchecksums/conversation/GettingChecksums.java @@ -89,11 +89,11 @@ protected void sendRequest() { msg.setPillarID(query.getComponentID()); msg.setDestination(activeContributors.get(query.getComponentID())); - if (query.getMinTimestamp() != null) { - msg.setMinTimestamp(CalendarUtils.getXmlGregorianCalendar(query.getMinTimestamp())); + if (query.getMinTimestampInstant() != null) { + msg.setMinTimestamp(CalendarUtils.getXmlGregorianCalendar(query.getMinTimestampInstant())); } - if (query.getMaxTimestamp() != null) { - msg.setMaxTimestamp(CalendarUtils.getXmlGregorianCalendar(query.getMaxTimestamp())); + if (query.getMaxTimestampInstant() != null) { + msg.setMaxTimestamp(CalendarUtils.getXmlGregorianCalendar(query.getMaxTimestampInstant())); } if (query.getMaxNumberOfResults() != null) { msg.setMaxNumberOfResults(BigInteger.valueOf(query.getMaxNumberOfResults())); diff --git a/bitrepository-client/src/main/java/org/bitrepository/access/getfileids/conversation/GettingFileIDs.java b/bitrepository-client/src/main/java/org/bitrepository/access/getfileids/conversation/GettingFileIDs.java index a21a339bc..2f9c6ad3e 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/access/getfileids/conversation/GettingFileIDs.java +++ b/bitrepository-client/src/main/java/org/bitrepository/access/getfileids/conversation/GettingFileIDs.java @@ -71,11 +71,11 @@ protected void sendRequest() { msg.setPillarID(query.getComponentID()); msg.setDestination(activeContributors.get(query.getComponentID())); - if (query.getMinTimestamp() != null) { - msg.setMinTimestamp(CalendarUtils.getXmlGregorianCalendar(query.getMinTimestamp())); + if (query.getMinTimestampInstant() != null) { + msg.setMinTimestamp(CalendarUtils.getXmlGregorianCalendar(query.getMinTimestampInstant())); } - if (query.getMaxTimestamp() != null) { - msg.setMaxTimestamp(CalendarUtils.getXmlGregorianCalendar(query.getMaxTimestamp())); + if (query.getMaxTimestampInstant() != null) { + msg.setMaxTimestamp(CalendarUtils.getXmlGregorianCalendar(query.getMaxTimestampInstant())); } if (query.getMaxNumberOfResults() != null) { msg.setMaxNumberOfResults(BigInteger.valueOf(query.getMaxNumberOfResults())); diff --git a/bitrepository-client/src/main/java/org/bitrepository/client/conversation/ConversationEventMonitor.java b/bitrepository-client/src/main/java/org/bitrepository/client/conversation/ConversationEventMonitor.java index cd02425f8..25668cfff 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/client/conversation/ConversationEventMonitor.java +++ b/bitrepository-client/src/main/java/org/bitrepository/client/conversation/ConversationEventMonitor.java @@ -326,24 +326,19 @@ private String getShortConversationID(String fullConversationID) { } private DefaultEvent createDefaultEvent(OperationEvent.OperationEventType eventType, String info) { - DefaultEvent event = new DefaultEvent(collectionID); - event.setEventType(eventType); - event.setInfo(info); + DefaultEvent event = new DefaultEvent(eventType, collectionID, info); addContextInfo(event); return event; } private ContributorEvent createContributorEvent(OperationEvent.OperationEventType eventType, String info, String contributorID) { - ContributorEvent event = new ContributorEvent(contributorID, collectionID); - event.setEventType(eventType); - event.setInfo(info); + ContributorEvent event = new ContributorEvent(eventType, contributorID, collectionID, info); addContextInfo(event); return event; } private ContributorFailedEvent createContributorFailedEvent(String info, String contributorID, ResponseCode responseCode) { - ContributorFailedEvent event = new ContributorFailedEvent(contributorID, collectionID, responseCode); - event.setInfo(info); + ContributorFailedEvent event = new ContributorFailedEvent(contributorID, collectionID, responseCode, info); addContextInfo(event); return event; } @@ -355,7 +350,7 @@ private IdentificationCompleteEvent createContributorsIdentifiedEvent(ListOperationEvent. */ public abstract class AbstractOperationEvent implements OperationEvent { - private OperationEventType type; + private final OperationEventType type; private OperationType operationType; private String fileID; - private String info; + private final String info; private String conversationID; - private String collectionID; + private final String collectionID; + + protected AbstractOperationEvent(OperationEventType type, String collectionID, String info) { + this.type = type; + this.info = info; + this.collectionID = collectionID; + } + + protected AbstractOperationEvent(OperationEventType type, String collectionID) { + this.type = type; + this.info = null; + this.collectionID = collectionID; + } @Override public String getCollectionID() { return collectionID; } - public void setCollectionID(String collectionID) { - this.collectionID = collectionID; - } @Override public String getInfo() { @@ -71,13 +80,7 @@ public String getConversationID() { return conversationID; } - /** - * @param type The {@link OperationEventType} to set as the event type - * @see #getEventType - */ - public void setEventType(OperationEventType type) { - this.type = type; - } + /** * @param operationType The {@link OperationType} to set as the operation type @@ -95,13 +98,7 @@ public void setFileID(String fileID) { this.fileID = fileID; } - /** - * @param info The content of the info field - * @see #getInfo - */ - public void setInfo(String info) { - this.info = info; - } + /** * @param conversationID See {@link #getConversationID} diff --git a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/CompleteEvent.java b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/CompleteEvent.java index 4989af39e..61c6fd2d7 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/CompleteEvent.java +++ b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/CompleteEvent.java @@ -42,9 +42,7 @@ public class CompleteEvent extends AbstractOperationEvent { * the operation. */ public CompleteEvent(String collectionID, List componentResults) { - super(); - setCollectionID(collectionID); - setEventType(OperationEventType.COMPLETE); + super(OperationEventType.COMPLETE, collectionID, null); this.componentResults = componentResults; } diff --git a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorCompleteEvent.java b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorCompleteEvent.java index 925d47703..765d6ecd5 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorCompleteEvent.java +++ b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorCompleteEvent.java @@ -25,8 +25,11 @@ * The parent class for all the concrete operation specific contributors complete events */ public class ContributorCompleteEvent extends ContributorEvent { + public ContributorCompleteEvent(String contributorID, String collectionID, String info) { + super(OperationEventType.COMPONENT_COMPLETE, contributorID, collectionID, info); + } + public ContributorCompleteEvent(String contributorID, String collectionID) { - super(contributorID, collectionID); - setEventType(OperationEventType.COMPONENT_COMPLETE); + super(OperationEventType.COMPONENT_COMPLETE, contributorID, collectionID); } } diff --git a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorEvent.java b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorEvent.java index b9db0305a..9829ad33b 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorEvent.java +++ b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorEvent.java @@ -33,10 +33,19 @@ public class ContributorEvent extends AbstractOperationEvent { /** * @param contributorID The contributorID for which this event concerns. * @param collectionID the collectionID for which this event concerns. + * @param info the Info */ - public ContributorEvent(String contributorID, String collectionID) { - super(); - setCollectionID(collectionID); + public ContributorEvent(OperationEventType eventType, String contributorID, String collectionID, final String info) { + super(eventType, collectionID, info); + this.contributorID = contributorID; + } + + /** + * @param contributorID The contributorID for which this event concerns. + * @param collectionID the collectionID for which this event concerns. + */ + public ContributorEvent(OperationEventType eventType, String contributorID, String collectionID) { + super(eventType, collectionID); this.contributorID = contributorID; } diff --git a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorFailedEvent.java b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorFailedEvent.java index 44e02a977..98b37ac34 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorFailedEvent.java +++ b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/ContributorFailedEvent.java @@ -28,6 +28,17 @@ public class ContributorFailedEvent extends ContributorEvent { private final ResponseCode responseCode; + /** + * @param contributorID the contributor + * @param collectionID the collection + * @param responseCode The response code from any response indicating the failure. Might be null if no relevant + * response exists. + */ + public ContributorFailedEvent(String contributorID, String collectionID, ResponseCode responseCode, String info) { + super(COMPONENT_FAILED, contributorID, collectionID, info); + this.responseCode = responseCode; + } + /** * @param contributorID the contributor * @param collectionID the collection @@ -35,8 +46,7 @@ public class ContributorFailedEvent extends ContributorEvent { * response exists. */ public ContributorFailedEvent(String contributorID, String collectionID, ResponseCode responseCode) { - super(contributorID, collectionID); - setEventType(COMPONENT_FAILED); + super(COMPONENT_FAILED, contributorID, collectionID); this.responseCode = responseCode; } diff --git a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/DefaultEvent.java b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/DefaultEvent.java index d59e5a8c0..2b18962fb 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/DefaultEvent.java +++ b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/DefaultEvent.java @@ -29,9 +29,12 @@ */ public class DefaultEvent extends AbstractOperationEvent { - public DefaultEvent(String collectionID) { - super(); - setCollectionID(collectionID); + public DefaultEvent(final OperationEventType type, final String collectionID, final String info) { + super(type, collectionID, info); + } + + public DefaultEvent(final OperationEventType type, final String collectionID) { + super(type, collectionID); } @Override diff --git a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/IdentificationCompleteEvent.java b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/IdentificationCompleteEvent.java index 180cd4037..c567ef944 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/IdentificationCompleteEvent.java +++ b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/IdentificationCompleteEvent.java @@ -37,9 +37,7 @@ public class IdentificationCompleteEvent extends AbstractOperationEvent { * @param contributorIDs The list of IDs of the contributor this event relates to. */ public IdentificationCompleteEvent(String collectionID, List contributorIDs) { - super(); - setCollectionID(collectionID); - setEventType(OperationEventType.IDENTIFICATION_COMPLETE); + super(OperationEventType.IDENTIFICATION_COMPLETE, collectionID); this.contributorIDs = contributorIDs; } diff --git a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/OperationFailedEvent.java b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/OperationFailedEvent.java index 0e2f5f46a..68f74b1d7 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/OperationFailedEvent.java +++ b/bitrepository-client/src/main/java/org/bitrepository/client/eventhandler/OperationFailedEvent.java @@ -35,14 +35,22 @@ public class OperationFailedEvent extends AbstractOperationEvent { /** * @param collectionID the collection ID + * @param componentResults The aggregated list of COMPONENT_COMPLETE events generated during + * the operation. * @param info See {@link #getInfo()} + */ + public OperationFailedEvent(String collectionID, List componentResults, String info) { + super(OperationEventType.FAILED, collectionID, info); + this.componentResults = componentResults; + } + + /** + * @param collectionID the collection ID * @param componentResults The aggregated list of COMPONENT_COMPLETE events generated during * the operation. */ - public OperationFailedEvent(String collectionID, String info, List componentResults) { - setEventType(OperationEventType.FAILED); - setInfo(info); - setCollectionID(collectionID); + public OperationFailedEvent(String collectionID, List componentResults) { + super(OperationEventType.FAILED, collectionID); this.componentResults = componentResults; } diff --git a/bitrepository-client/src/main/java/org/bitrepository/commandline/CommandLineClient.java b/bitrepository-client/src/main/java/org/bitrepository/commandline/CommandLineClient.java index 97c6eb732..36fbb97cf 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/CommandLineClient.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/CommandLineClient.java @@ -59,7 +59,6 @@ * Defines the common functionality for command-line-clients. */ public abstract class CommandLineClient { - private final String componentID; protected OutputHandler output = new DefaultOutputHandler(getClass()); protected Settings settings; protected SecurityManager securityManager; @@ -104,7 +103,6 @@ protected CommandLineClient(String... args) { output.setVerbosity(true); } settings = cmdHandler.loadSettings(); - componentID = settings.getComponentID(); securityManager = cmdHandler.loadSecurityManager(settings); fileIDValidator = new FileIDValidator(settings); @@ -123,14 +121,6 @@ protected CommandLineClient(String... args) { */ protected abstract void performOperation(); - /** - * Defines the componentID of the concrete client. Must be specified by in the subclass. - * - * @return The componentID of the concrete client. - */ - protected String getComponentID() { - return componentID; - } /** * Used for determining whether the fileID Argument is required for the concrete operation. diff --git a/bitrepository-client/src/main/java/org/bitrepository/commandline/DeleteFileCmd.java b/bitrepository-client/src/main/java/org/bitrepository/commandline/DeleteFileCmd.java index bbbf72060..17b8e29d0 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/DeleteFileCmd.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/DeleteFileCmd.java @@ -61,7 +61,7 @@ public static void main(String[] args) { protected DeleteFileCmd(String... args) { super(args); client = ModifyComponentFactory.getInstance().retrieveDeleteFileClient(settings, securityManager, - getComponentID()); + settings.getComponentID()); } @Override diff --git a/bitrepository-client/src/main/java/org/bitrepository/commandline/GetChecksumsCmd.java b/bitrepository-client/src/main/java/org/bitrepository/commandline/GetChecksumsCmd.java index 111375f80..a96905893 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/GetChecksumsCmd.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/GetChecksumsCmd.java @@ -55,7 +55,7 @@ public static void main(String[] args) { protected GetChecksumsCmd(String... args) { super(args); GetChecksumsClient client = AccessComponentFactory.getInstance().createGetChecksumsClient(settings, - securityManager, getComponentID()); + securityManager, settings.getComponentID()); GetChecksumsOutputFormatter outputFormatter = retrieveOutputFormatter(); int pageSize = SettingsUtils.getMaxClientPageSize(); pagingClient = new PagingGetChecksumsClient(client, getTimeout(), pageSize, outputFormatter, output); diff --git a/bitrepository-client/src/main/java/org/bitrepository/commandline/GetFileCmd.java b/bitrepository-client/src/main/java/org/bitrepository/commandline/GetFileCmd.java index b65251252..ad3ba09ab 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/GetFileCmd.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/GetFileCmd.java @@ -63,8 +63,8 @@ public static void main(String[] args) { */ protected GetFileCmd(String... args) { super(args); - client = AccessComponentFactory.getInstance().createGetFileClient(settings, securityManager, - getComponentID()); + client = AccessComponentFactory.getInstance().createGetFileClient( + settings, securityManager, settings.getComponentID()); } @Override diff --git a/bitrepository-client/src/main/java/org/bitrepository/commandline/GetFileIDsCmd.java b/bitrepository-client/src/main/java/org/bitrepository/commandline/GetFileIDsCmd.java index db2f6744e..04951e309 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/GetFileIDsCmd.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/GetFileIDsCmd.java @@ -57,7 +57,7 @@ protected GetFileIDsCmd(String... args) { super(args); output.debug("Instantiation GetFileIDClient."); GetFileIDsClient client = AccessComponentFactory.getInstance().createGetFileIDsClient(settings, - securityManager, getComponentID()); + securityManager, settings.getComponentID()); output.debug("Instantiation GetFileID outputFormatter."); GetFileIDsOutputFormatter outputFormatter = new GetFileIDsInfoFormatter(output); diff --git a/bitrepository-client/src/main/java/org/bitrepository/commandline/PutFileCmd.java b/bitrepository-client/src/main/java/org/bitrepository/commandline/PutFileCmd.java index 31dd59e95..81fcbef96 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/PutFileCmd.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/PutFileCmd.java @@ -86,7 +86,7 @@ public static void main(String[] args) { */ protected PutFileCmd(String... args) { super(args); - client = ModifyComponentFactory.getInstance().retrievePutClient(settings, securityManager, getComponentID()); + client = ModifyComponentFactory.getInstance().retrievePutClient(settings, securityManager, settings.getComponentID()); } @Override diff --git a/bitrepository-client/src/main/java/org/bitrepository/commandline/ReplaceFileCmd.java b/bitrepository-client/src/main/java/org/bitrepository/commandline/ReplaceFileCmd.java index eb6208941..e87c02c77 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/ReplaceFileCmd.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/ReplaceFileCmd.java @@ -72,7 +72,8 @@ public static void main(String[] args) { */ protected ReplaceFileCmd(String... args) { super(args); - client = ModifyComponentFactory.getInstance().retrieveReplaceFileClient(settings, securityManager, getComponentID()); + client = ModifyComponentFactory.getInstance().retrieveReplaceFileClient(settings, securityManager, + settings.getComponentID()); } @Override diff --git a/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/IdentifyPillarsForPutFile.java b/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/IdentifyPillarsForPutFile.java index 10dbc04c1..4071daf00 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/IdentifyPillarsForPutFile.java +++ b/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/IdentifyPillarsForPutFile.java @@ -63,8 +63,8 @@ protected void handleFailureResponse(MessageResponse msg) throws UnableToFinishE if (ChecksumUtils.areEqual( response.getChecksumDataForExistingFile(), context.getChecksumForValidationAtPillar())) { PutFileCompletePillarEvent event = new PutFileCompletePillarEvent( - response.getPillarID(), response.getCollectionID(), response.getChecksumDataForExistingFile(), response.getResponseInfo()); - event.setInfo("File already existed on " + response.getPillarID()); + response.getPillarID(), response.getCollectionID(), response.getChecksumDataForExistingFile(), response.getResponseInfo(), + "File already existed on " + response.getPillarID()); getContext().getMonitor().contributorComplete(event); } else { getContext().getMonitor().contributorFailed( diff --git a/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/PutFileCompletePillarEvent.java b/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/PutFileCompletePillarEvent.java index a51cfe1e2..be0362b22 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/PutFileCompletePillarEvent.java +++ b/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/PutFileCompletePillarEvent.java @@ -40,9 +40,14 @@ public class PutFileCompletePillarEvent extends ContributorCompleteEvent { * @param pillarID The pillar which generated the result * @param collectionID The ID of the collection * @param result The result returned by the pillar. + * @param info */ - public PutFileCompletePillarEvent(String pillarID, String collectionID, ChecksumDataForFileTYPE result, ResponseInfo responseInfo) { - super(pillarID, collectionID); + public PutFileCompletePillarEvent(String pillarID, + String collectionID, + ChecksumDataForFileTYPE result, + ResponseInfo responseInfo, + final String info) { + super(pillarID, collectionID, info); this.result = result; this.responseInfo = responseInfo; } diff --git a/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/PuttingFile.java b/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/PuttingFile.java index 2899a18d9..e210fbf13 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/PuttingFile.java +++ b/bitrepository-client/src/main/java/org/bitrepository/modify/putfile/conversation/PuttingFile.java @@ -59,10 +59,14 @@ public PuttingFile(PutFileConversationContext context, Collection. * #L% */ package org.bitrepository.client; +import jakarta.jms.JMSException; import org.bitrepository.client.conversation.mediator.CollectionBasedConversationMediator; import org.bitrepository.client.conversation.mediator.ConversationMediator; +import org.bitrepository.pillar.integration.ArtemisFixedPortContainer; import org.bitrepository.protocol.IntegrationTest; +import org.bitrepository.protocol.activemq.ActiveMQMessageBus; import org.bitrepository.protocol.bus.MessageReceiver; import org.bitrepository.protocol.message.ClientTestMessageFactory; import org.bitrepository.protocol.messagebus.MessageBusManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.TestInstance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.activemq.ArtemisContainer; +import org.testcontainers.containers.InternetProtocol; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; /** - * Contains the generic parts for tests integrating to the message bus. + * Contains the generic parts for tests integrating to the message bus. */ -public abstract class DefaultFixtureClientTest extends IntegrationTest { +@Testcontainers +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public abstract class DefaultFixtureClientIT extends IntegrationTest { protected static final String DEFAULT_FILE_ID = ClientTestMessageFactory.FILE_ID_DEFAULT; - + private static final Logger log = LoggerFactory.getLogger(DefaultFixtureClientIT.class); protected static MessageReceiver collectionReceiver; protected static String pillar1DestinationId; @@ -49,32 +62,29 @@ public abstract class DefaultFixtureClientTest extends IntegrationTest { protected ConversationMediator conversationMediator; + @Container + static ArtemisContainer activemqContainer = new ArtemisFixedPortContainer("apache/artemis:2.55.0") + .withFixedExposedPort(9999, 61616, InternetProtocol.TCP) + .withEnv("ANONYMOUS_LOGIN","true"); + @Override protected void initializeCUT() { - MessageBusManager.injectCustomMessageBus(MessageBusManager.DEFAULT_MESSAGE_BUS, messageBus); + super.initializeCUT(); renewConversationMediator(); } - @Override - protected void shutdownCUT() { - shutdownConversationMediator(); - } - @Override protected void registerMessageReceivers() { super.registerMessageReceivers(); - - collectionReceiver = new MessageReceiver(settingsForCUT.getCollectionDestination()); - addReceiver(collectionReceiver); + collectionReceiver = addReceiver(new MessageReceiver(settingsForCUT.getCollectionDestination())); pillar1DestinationId = "Pillar1_topic" + getTopicPostfix(); - pillar1Receiver = new MessageReceiver(pillar1DestinationId); - addReceiver(pillar1Receiver); + pillar1Receiver = addReceiver(new MessageReceiver(pillar1DestinationId)); pillar2DestinationId = "Pillar2_topic" + getTopicPostfix(); - pillar2Receiver = new MessageReceiver(pillar2DestinationId); - addReceiver(pillar2Receiver); + pillar2Receiver = addReceiver(new MessageReceiver(pillar2DestinationId)); } + /** * Used for creating a new conversationMediator between tests, and for tests needing to use a differently configured * mediator. @@ -86,10 +96,38 @@ protected void renewConversationMediator() { conversationMediator = new CollectionBasedConversationMediator(settingsForCUT, securityManager); } - private void shutdownConversationMediator() { - if (conversationMediator != null) { - conversationMediator.shutdown(); + /** + * Hooks up the message bus. + */ + protected void setupMessageBus() { + activemqContainer.start(); + while (!activemqContainer.isRunning()) { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + settingsForTestClient.getMessageBusConfiguration().setURL(activemqContainer.getBrokerUrl()); + messageBus = new ActiveMQMessageBus(settingsForTestClient, securityManager); + MessageBusManager.clear(); + MessageBusManager.injectCustomMessageBus(MessageBusManager.DEFAULT_MESSAGE_BUS, messageBus); + } + + /** + * Shutdown the message bus. + */ + @Override + protected void teardownMessageBus() { + MessageBusManager.clear(); + if (messageBus != null) { + try { + messageBus.close(); + messageBus = null; + } catch (JMSException e) { + log.warn("Failed when close the messageBus", e); + } + activemqContainer.stop(); } - conversationMediator = null; } } diff --git a/bitrepository-client/src/test/java/org/bitrepository/commandline/DeleteFileCmdTest.java b/bitrepository-client/src/test/java/org/bitrepository/commandline/DeleteFileCmdIT.java similarity index 97% rename from bitrepository-client/src/test/java/org/bitrepository/commandline/DeleteFileCmdTest.java rename to bitrepository-client/src/test/java/org/bitrepository/commandline/DeleteFileCmdIT.java index 324be49f7..73acfd626 100644 --- a/bitrepository-client/src/test/java/org/bitrepository/commandline/DeleteFileCmdTest.java +++ b/bitrepository-client/src/test/java/org/bitrepository/commandline/DeleteFileCmdIT.java @@ -22,7 +22,7 @@ package org.bitrepository.commandline; import org.bitrepository.SuiteInfoParameterResolver; -import org.bitrepository.client.DefaultFixtureClientTest; +import org.bitrepository.client.DefaultFixtureClientIT; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -35,7 +35,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @ExtendWith(SuiteInfoParameterResolver.class) -public class DeleteFileCmdTest extends DefaultFixtureClientTest { +public class DeleteFileCmdIT extends DefaultFixtureClientIT { private static final String SETTINGS_DIR = "settings/xml/bitrepository-devel"; private static final String KEY_FILE = "KeyFile"; private static final String DEFAULT_CHECKSUM = "0123456789"; diff --git a/bitrepository-client/src/test/java/org/bitrepository/commandline/GetChecksumsCmdTest.java b/bitrepository-client/src/test/java/org/bitrepository/commandline/GetChecksumsCmdIT.java similarity index 97% rename from bitrepository-client/src/test/java/org/bitrepository/commandline/GetChecksumsCmdTest.java rename to bitrepository-client/src/test/java/org/bitrepository/commandline/GetChecksumsCmdIT.java index ac5181d84..e29728999 100644 --- a/bitrepository-client/src/test/java/org/bitrepository/commandline/GetChecksumsCmdTest.java +++ b/bitrepository-client/src/test/java/org/bitrepository/commandline/GetChecksumsCmdIT.java @@ -22,7 +22,7 @@ package org.bitrepository.commandline; import org.bitrepository.SuiteInfoParameterResolver; -import org.bitrepository.client.DefaultFixtureClientTest; +import org.bitrepository.client.DefaultFixtureClientIT; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @ExtendWith(SuiteInfoParameterResolver.class) -public class GetChecksumsCmdTest extends DefaultFixtureClientTest { +public class GetChecksumsCmdIT extends DefaultFixtureClientIT { private static final String SETTINGS_DIR = "settings/xml/bitrepository-devel"; private static final String KEY_FILE = "KeyFile"; diff --git a/bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileCmdTest.java b/bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileCmdIT.java similarity index 96% rename from bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileCmdTest.java rename to bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileCmdIT.java index bdf8f6f11..15d21d77f 100644 --- a/bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileCmdTest.java +++ b/bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileCmdIT.java @@ -22,7 +22,7 @@ package org.bitrepository.commandline; import org.bitrepository.SuiteInfoParameterResolver; -import org.bitrepository.client.DefaultFixtureClientTest; +import org.bitrepository.client.DefaultFixtureClientIT; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @ExtendWith(SuiteInfoParameterResolver.class) -public class GetFileCmdTest extends DefaultFixtureClientTest { +public class GetFileCmdIT extends DefaultFixtureClientIT { private static final String SETTINGS_DIR = "settings/xml/bitrepository-devel"; private static final String KEY_FILE = "KeyFile"; diff --git a/bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileIDsCmdTest.java b/bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileIDsCmdIT.java similarity index 96% rename from bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileIDsCmdTest.java rename to bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileIDsCmdIT.java index e97b32900..674975fc7 100644 --- a/bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileIDsCmdTest.java +++ b/bitrepository-client/src/test/java/org/bitrepository/commandline/GetFileIDsCmdIT.java @@ -22,7 +22,7 @@ package org.bitrepository.commandline; import org.bitrepository.SuiteInfoParameterResolver; -import org.bitrepository.client.DefaultFixtureClientTest; +import org.bitrepository.client.DefaultFixtureClientIT; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @ExtendWith(SuiteInfoParameterResolver.class) -public class GetFileIDsCmdTest extends DefaultFixtureClientTest { +public class GetFileIDsCmdIT extends DefaultFixtureClientIT { private static final String SETTINGS_DIR = "settings/xml/bitrepository-devel"; private static final String KEY_FILE = "KeyFile"; diff --git a/bitrepository-client/src/test/java/org/bitrepository/commandline/PutFileCmdTest.java b/bitrepository-client/src/test/java/org/bitrepository/commandline/PutFileCmdIT.java similarity index 98% rename from bitrepository-client/src/test/java/org/bitrepository/commandline/PutFileCmdTest.java rename to bitrepository-client/src/test/java/org/bitrepository/commandline/PutFileCmdIT.java index 61b096f02..2160cbcc7 100644 --- a/bitrepository-client/src/test/java/org/bitrepository/commandline/PutFileCmdTest.java +++ b/bitrepository-client/src/test/java/org/bitrepository/commandline/PutFileCmdIT.java @@ -22,7 +22,7 @@ package org.bitrepository.commandline; import org.bitrepository.SuiteInfoParameterResolver; -import org.bitrepository.client.DefaultFixtureClientTest; +import org.bitrepository.client.DefaultFixtureClientIT; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -32,7 +32,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @ExtendWith(SuiteInfoParameterResolver.class) -public class PutFileCmdTest extends DefaultFixtureClientTest { +public class PutFileCmdIT extends DefaultFixtureClientIT { private static final String SETTINGS_DIR = "settings/xml/bitrepository-devel"; private static final String KEY_FILE = "KeyFile"; private static final String DEFAULT_CHECKSUM = "0123456789"; diff --git a/bitrepository-client/src/test/java/org/bitrepository/commandline/ReplaceFileCmdTest.java b/bitrepository-client/src/test/java/org/bitrepository/commandline/ReplaceFileCmdIT.java similarity index 98% rename from bitrepository-client/src/test/java/org/bitrepository/commandline/ReplaceFileCmdTest.java rename to bitrepository-client/src/test/java/org/bitrepository/commandline/ReplaceFileCmdIT.java index c3c29642b..0d4cc4c5a 100644 --- a/bitrepository-client/src/test/java/org/bitrepository/commandline/ReplaceFileCmdTest.java +++ b/bitrepository-client/src/test/java/org/bitrepository/commandline/ReplaceFileCmdIT.java @@ -22,7 +22,7 @@ package org.bitrepository.commandline; import org.bitrepository.SuiteInfoParameterResolver; -import org.bitrepository.client.DefaultFixtureClientTest; +import org.bitrepository.client.DefaultFixtureClientIT; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -35,7 +35,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @ExtendWith(SuiteInfoParameterResolver.class) -public class ReplaceFileCmdTest extends DefaultFixtureClientTest { +public class ReplaceFileCmdIT extends DefaultFixtureClientIT { private static final String SETTINGS_DIR = "settings/xml/bitrepository-devel"; private static final String KEY_FILE = "KeyFile"; private static final String DEFAULT_CHECKSUM = "0123456789"; diff --git a/bitrepository-client/src/test/java/org/bitrepository/commandline/utils/ChecksumExtractionUtilsTest.java b/bitrepository-client/src/test/java/org/bitrepository/commandline/utils/ChecksumExtractionUtilsIT.java similarity index 97% rename from bitrepository-client/src/test/java/org/bitrepository/commandline/utils/ChecksumExtractionUtilsTest.java rename to bitrepository-client/src/test/java/org/bitrepository/commandline/utils/ChecksumExtractionUtilsIT.java index 76b8153c5..428aa4680 100644 --- a/bitrepository-client/src/test/java/org/bitrepository/commandline/utils/ChecksumExtractionUtilsTest.java +++ b/bitrepository-client/src/test/java/org/bitrepository/commandline/utils/ChecksumExtractionUtilsIT.java @@ -24,7 +24,7 @@ import org.apache.commons.cli.Option; import org.bitrepository.SuiteInfoParameterResolver; import org.bitrepository.bitrepositoryelements.ChecksumType; -import org.bitrepository.client.DefaultFixtureClientTest; +import org.bitrepository.client.DefaultFixtureClientIT; import org.bitrepository.commandline.Constants; import org.bitrepository.commandline.output.OutputHandler; import org.junit.jupiter.api.Assertions; @@ -37,7 +37,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; @ExtendWith(SuiteInfoParameterResolver.class) -public class ChecksumExtractionUtilsTest extends DefaultFixtureClientTest { +public class ChecksumExtractionUtilsIT extends DefaultFixtureClientIT { CommandLineArgumentsHandler cmdHandler; OutputHandler output; diff --git a/bitrepository-client/src/test/java/org/bitrepository/modify/deletefile/DeleteFileClientComponentTest.java b/bitrepository-client/src/test/java/org/bitrepository/modify/deletefile/DeleteFileClientComponentIT.java similarity index 99% rename from bitrepository-client/src/test/java/org/bitrepository/modify/deletefile/DeleteFileClientComponentTest.java rename to bitrepository-client/src/test/java/org/bitrepository/modify/deletefile/DeleteFileClientComponentIT.java index a6f3d47b6..d028061b2 100644 --- a/bitrepository-client/src/test/java/org/bitrepository/modify/deletefile/DeleteFileClientComponentTest.java +++ b/bitrepository-client/src/test/java/org/bitrepository/modify/deletefile/DeleteFileClientComponentIT.java @@ -35,7 +35,7 @@ import org.bitrepository.bitrepositorymessages.DeleteFileRequest; import org.bitrepository.bitrepositorymessages.IdentifyPillarsForDeleteFileRequest; import org.bitrepository.bitrepositorymessages.IdentifyPillarsForDeleteFileResponse; -import org.bitrepository.client.DefaultFixtureClientTest; +import org.bitrepository.client.DefaultFixtureClientIT; import org.bitrepository.client.TestEventHandler; import org.bitrepository.client.eventhandler.OperationEvent.OperationEventType; import org.bitrepository.common.utils.Base16Utils; @@ -55,7 +55,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -public class DeleteFileClientComponentTest extends DefaultFixtureClientTest { +public class DeleteFileClientComponentIT extends DefaultFixtureClientIT { private TestDeleteFileMessageFactory messageFactory; private DatatypeFactory datatypeFactory; @@ -487,7 +487,7 @@ public void deleteOnChecksumPillar() throws Exception { IdentifyPillarsForDeleteFileRequest.class); addStep("Send an identification response from pillar2.", - "This should be ignored, eg. no events should be generated."); + "This should be ignored, i.e. no events should be generated."); IdentifyPillarsForDeleteFileResponse identifyResponse2 = messageFactory.createIdentifyPillarsForDeleteFileResponse(receivedIdentifyRequestMessage, PILLAR2_ID, pillar2DestinationId, DEFAULT_FILE_ID); diff --git a/bitrepository-client/src/test/java/org/bitrepository/modify/putfile/PutFileClientComponentTest.java b/bitrepository-client/src/test/java/org/bitrepository/modify/putfile/PutFileClientComponentIT.java similarity index 98% rename from bitrepository-client/src/test/java/org/bitrepository/modify/putfile/PutFileClientComponentTest.java rename to bitrepository-client/src/test/java/org/bitrepository/modify/putfile/PutFileClientComponentIT.java index a11c3d569..da73ddae0 100644 --- a/bitrepository-client/src/test/java/org/bitrepository/modify/putfile/PutFileClientComponentTest.java +++ b/bitrepository-client/src/test/java/org/bitrepository/modify/putfile/PutFileClientComponentIT.java @@ -40,7 +40,7 @@ import org.bitrepository.bitrepositorymessages.PutFileFinalResponse; import org.bitrepository.bitrepositorymessages.PutFileProgressResponse; import org.bitrepository.bitrepositorymessages.PutFileRequest; -import org.bitrepository.client.DefaultFixtureClientTest; +import org.bitrepository.client.DefaultFixtureClientIT; import org.bitrepository.client.TestEventHandler; import org.bitrepository.client.eventhandler.OperationEvent.OperationEventType; import org.bitrepository.common.utils.Base16Utils; @@ -63,7 +63,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -public class PutFileClientComponentTest extends DefaultFixtureClientTest { +public class PutFileClientComponentIT extends DefaultFixtureClientIT { private TestPutFileMessageFactory messageFactory; private DatatypeFactory datatypeFactory; @@ -160,10 +160,10 @@ public void normalPutFile() throws Exception { @Tag("regressiontest") public void noPillarsResponding() throws Exception { addDescription("Tests the handling of missing identification responses from all pillar"); - addFixture("Sets the identification timeout to 100 ms."); + addFixture("Sets the identification timeout to 1000 ms."); settingsForCUT.getRepositorySettings().getClientSettings() - .setIdentificationTimeoutDuration(datatypeFactory.newDuration(100)); + .setIdentificationTimeoutDuration(datatypeFactory.newDuration(1000)); TestEventHandler testEventHandler = new TestEventHandler(); PutFileClient putClient = createPutFileClient(); @@ -190,9 +190,9 @@ public void noPillarsResponding() throws Exception { @Severity(SeverityLevel.CRITICAL) public void onePillarRespondingWithPartialPutAllowed() throws Exception { - Allure.step("Fixture: Set identification timeout to 100 ms and allow partial puts.", () -> { + Allure.step("Fixture: Set identification timeout to 2000 ms and allow partial puts.", () -> { settingsForCUT.getRepositorySettings().getClientSettings() - .setIdentificationTimeoutDuration(datatypeFactory.newDuration(100)); + .setIdentificationTimeoutDuration(datatypeFactory.newDuration(2000)); settingsForCUT.getReferenceSettings().getPutFileSettings().setPartialPutsAllow(true); }); @@ -244,10 +244,10 @@ public void onePillarRespondingWithPartialPutAllowed() throws Exception { public void onePillarRespondingWithPartialPutDisallowed() throws Exception { addDescription("Tests the handling of missing identification responses from one pillar, " + "when partial put are allowed"); - addFixture("Sets the identification timeout to 100 ms and disallow partial puts."); + addFixture("Sets the identification timeout to 2000 ms and disallow partial puts."); settingsForCUT.getRepositorySettings().getClientSettings() - .setIdentificationTimeoutDuration(datatypeFactory.newDuration(100)); + .setIdentificationTimeoutDuration(datatypeFactory.newDuration(2000)); settingsForCUT.getReferenceSettings().getPutFileSettings().setPartialPutsAllow(false); TestEventHandler testEventHandler = new TestEventHandler(); PutFileClient putClient = createPutFileClient(); @@ -303,7 +303,7 @@ public void putClientOperationTimeout() throws Exception { .createIdentifyPillarsForPutFileResponse( receivedIdentifyRequestMessage, PILLAR1_ID, pillar1DestinationId); messageBus.sendMessage(identifyResponse); - pillar1Receiver.waitForMessage(PutFileRequest.class, 10, TimeUnit.SECONDS); + pillar1Receiver.waitForMessage(PutFileRequest.class, 10, TimeUnit.SECONDS, identifyResponse.getCorrelationID()); addStep("Validate the steps of the PutClient by going through the events.", "Should be 'PillarIdentified', " + "'PillarSelected' and 'RequestSent'"); @@ -344,7 +344,8 @@ public void putClientPillarOperationFailed() throws Exception { IdentifyPillarsForPutFileResponse identifyResponse = messageFactory.createIdentifyPillarsForPutFileResponse( receivedIdentifyRequestMessage, PILLAR1_ID, pillar1DestinationId); messageBus.sendMessage(identifyResponse); - PutFileRequest receivedPutFileRequest = pillar1Receiver.waitForMessage(PutFileRequest.class, 10, TimeUnit.SECONDS); + PutFileRequest receivedPutFileRequest = pillar1Receiver.waitForMessage(PutFileRequest.class, 10, TimeUnit.SECONDS, + identifyResponse.getCorrelationID()); addStep("Validate the steps of the PutClient by going through the events.", "Should be 'PillarIdentified', 'PillarSelected' and 'RequestSent'"); diff --git a/bitrepository-client/src/test/java/org/bitrepository/modify/replacefile/ReplaceFileClientComponentTest.java b/bitrepository-client/src/test/java/org/bitrepository/modify/replacefile/ReplaceFileClientComponentIT.java similarity index 99% rename from bitrepository-client/src/test/java/org/bitrepository/modify/replacefile/ReplaceFileClientComponentTest.java rename to bitrepository-client/src/test/java/org/bitrepository/modify/replacefile/ReplaceFileClientComponentIT.java index 3c3cf32b3..eb2ea77b7 100644 --- a/bitrepository-client/src/test/java/org/bitrepository/modify/replacefile/ReplaceFileClientComponentTest.java +++ b/bitrepository-client/src/test/java/org/bitrepository/modify/replacefile/ReplaceFileClientComponentIT.java @@ -27,7 +27,7 @@ import org.bitrepository.SuiteInfoParameterResolver; import org.bitrepository.bitrepositoryelements.*; import org.bitrepository.bitrepositorymessages.*; -import org.bitrepository.client.DefaultFixtureClientTest; +import org.bitrepository.client.DefaultFixtureClientIT; import org.bitrepository.client.TestEventHandler; import org.bitrepository.client.eventhandler.OperationEvent; import org.bitrepository.client.eventhandler.OperationEvent.OperationEventType; @@ -50,7 +50,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -public class ReplaceFileClientComponentTest extends DefaultFixtureClientTest { +public class ReplaceFileClientComponentIT extends DefaultFixtureClientIT { private ChecksumSpecTYPE DEFAULT_CHECKSUM_SPEC; private ChecksumDataForFileTYPE DEFAULT_OLD_CHECKSUM_DATA; private ChecksumDataForFileTYPE DEFAULT_NEW_CHECKSUM_DATA; diff --git a/bitrepository-core/pom.xml b/bitrepository-core/pom.xml index 0d5f3bcb1..8a4ce1d13 100644 --- a/bitrepository-core/pom.xml +++ b/bitrepository-core/pom.xml @@ -18,76 +18,87 @@ org.bitrepository.repository-settings repository-settings-xsd - ${repository.settings.version} org.bitrepository.repository-settings repository-settings-java - ${repository.settings.version} - org.bitrepository - bitrepository-message-xml-xsd - ${message.xml.version} + org.bitrepository.message-xml + message-xml-xsd - org.bitrepository - bitrepository-message-xml-java - ${message.xml.version} + org.bitrepository.message-xml + message-xml-java commons-io commons-io - 2.21.0 org.apache.httpcomponents httpclient - 4.5.13 + + + com.fasterxml.jackson.core + jackson-databind + + + org.jetbrains + annotations + compile org.bouncycastle bcprov-jdk18on - 1.84 org.bouncycastle bcmail-jdk18on - 1.84 - org.apache.activemq + org.apache.artemis artemis-jakarta-client - ${artemis.version} commons-codec commons-codec - 1.14 - - - org.apache.activemq - artemis-server - ${artemis.version} - test + org.eclipse.jetty jetty-server - 12.1.8 test org.hamcrest - hamcrest-all - 1.3 + hamcrest-core test - org.jetbrains - annotations - 23.0.0 - compile + org.testcontainers + testcontainers-activemq + test + + + org.testcontainers + testcontainers-postgresql + test + + + org.testcontainers + testcontainers-junit-jupiter + test + + + org.apache.artemis + artemis-server + test + + + org.apache.activemq + activemq-broker + test diff --git a/bitrepository-core/src/main/java/org/bitrepository/common/JaxbHelper.java b/bitrepository-core/src/main/java/org/bitrepository/common/JaxbHelper.java index bd3992cbd..a7d554523 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/common/JaxbHelper.java +++ b/bitrepository-core/src/main/java/org/bitrepository/common/JaxbHelper.java @@ -24,6 +24,9 @@ */ package org.bitrepository.common; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.ls.LSInput; @@ -32,9 +35,6 @@ import org.xml.sax.SAXException; import javax.xml.XMLConstants; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; import javax.xml.transform.sax.SAXSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; diff --git a/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsCollectionSize.java b/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsCollectionSize.java index 37421e8a9..06a168628 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsCollectionSize.java +++ b/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsCollectionSize.java @@ -21,7 +21,7 @@ */ package org.bitrepository.common.webobjects; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class StatisticsCollectionSize { diff --git a/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsDataSize.java b/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsDataSize.java index 1eb204528..ec24028f3 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsDataSize.java +++ b/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsDataSize.java @@ -21,7 +21,7 @@ */ package org.bitrepository.common.webobjects; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class StatisticsDataSize { diff --git a/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsPillarSize.java b/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsPillarSize.java index 8f283eb43..9c9e5645d 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsPillarSize.java +++ b/bitrepository-core/src/main/java/org/bitrepository/common/webobjects/StatisticsPillarSize.java @@ -21,7 +21,7 @@ */ package org.bitrepository.common.webobjects; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class StatisticsPillarSize { diff --git a/bitrepository-core/src/main/java/org/bitrepository/protocol/activemq/ActiveMQMessageBus.java b/bitrepository-core/src/main/java/org/bitrepository/protocol/activemq/ActiveMQMessageBus.java index cc9246264..c83258d7d 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/protocol/activemq/ActiveMQMessageBus.java +++ b/bitrepository-core/src/main/java/org/bitrepository/protocol/activemq/ActiveMQMessageBus.java @@ -35,8 +35,6 @@ import jakarta.jms.TextMessage; import jakarta.jms.Topic; import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; - -import java.io.ByteArrayInputStream; import org.bitrepository.bitrepositorymessages.Message; import org.bitrepository.bitrepositorymessages.MessageRequest; import org.bitrepository.common.DefaultThreadFactory; @@ -67,12 +65,14 @@ import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; +import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.ThreadFactory; @@ -125,7 +125,7 @@ public class ActiveMQMessageBus implements MessageBus { * Used to identify if a listener is already registered. */ private final Map consumers = Collections - .synchronizedMap(new HashMap<>()); + .synchronizedMap(new HashMap<>()); /** * Map of destinations, mapping from ID to destination. */ @@ -153,8 +153,10 @@ public class ActiveMQMessageBus implements MessageBus { /** * ThreadFactory for any threads the activeMQ messageBus needs to create */ - private static final ThreadFactory threadFactory = new DefaultThreadFactory(ActiveMQMessageListener.class.getSimpleName() + "-", - Thread.NORM_PRIORITY, false); + private static final ThreadFactory threadFactory = new DefaultThreadFactory(ActiveMQMessageListener.class.getSimpleName() + + "-", + Thread.NORM_PRIORITY, false); + private final ActiveMQConnectionFactory connectionFactory; /** @@ -172,7 +174,7 @@ public ActiveMQMessageBus(Settings settings, SecurityManager securityManager) { clientID = settings.getComponentID(); String schemaLocation = "BitRepositoryMessages.xsd"; jaxbHelper = new JaxbHelper("xsd/", schemaLocation); - ActiveMQConnectionFactory connectionFactory = ArtemisConnectionFactoryProvider.create(configuration); + connectionFactory = ArtemisConnectionFactoryProvider.create(configuration); registerCustomMessageLoggers(); try { connection = connectionFactory.createConnection(); @@ -233,30 +235,75 @@ public synchronized void addListener(String destinationID, final MessageListener @Override public synchronized void removeListener(String destinationID, MessageListener listener) { log.debug("Removing listener '{}' from destination: '{}' on message-bus '{}'", - listener, destinationID, configuration); - MessageConsumer consumer = getMessageConsumer(destinationID, listener, false); + listener, destinationID, configuration); try { - // We need to set the listener to null to have the removeListener take effect at once. - // If this isn't done the listener will continue to receive messages. Do we have a memory leak here? - consumer.setMessageListener(null); - consumer.close(); - } catch (JMSException e) { - throw new CoordinationLayerException( + MessageConsumer consumer; + try { + consumer = getMessageConsumer(destinationID, listener, false); + } catch (CoordinationLayerException e) { + var cause = e.getCause(); + if (cause instanceof jakarta.jms.IllegalStateException + && Objects.equals(cause.getMessage(), "AMQ219019: Session is closed")) { + return; + } + throw e; + } + try { + + // We need to set the listener to null to have the removeListener take effect at once. + // If this isn't done the listener will continue to receive messages. Do we have a memory leak here? +// consumer.setMessageListener(null); + + consumer.close(); + } catch (IllegalStateException e) { + if (Objects.equals(e.getMessage(), "The Consumer is closed")) { + return; + } + throw new CoordinationLayerException( "Unable to remove listener '" + listener + "' from destinationID '" + destinationID + "'", e); + } catch (JMSException e) { + throw new CoordinationLayerException( + "Unable to remove listener '" + listener + "' from destinationID '" + destinationID + "'", e); + } + } finally { + String consumerHash = getConsumerHash(destinationID, listener); + consumers.remove(consumerHash); + } - consumers.remove(getConsumerHash(destinationID, listener)); } @Override public void close() throws JMSException { - receivedMessageHandler.close(); log.info("Closing message bus: {}", configuration); - producerSession.close(); - log.debug("Producer session closed."); - consumerSession.close(); - log.debug("Consumer session closed."); - connection.close(); - log.debug("Connection closed."); + try { + receivedMessageHandler.close(); + } catch (Exception e) { + log.warn("Exception while closing ActiveMQMessageBus receivedMessageHandler", e); + } + try { + producerSession.close(); + log.debug("Producer session closed."); + } catch (JMSException e) { + log.warn("Exception while closing ActiveMQMessageBus ProducerSession", e); + } + try { + consumerSession.close(); + log.debug("Consumer session closed."); + } catch (JMSException e) { + log.warn("Exception while closing ActiveMQMessageBus ConsumerSession", e); + } + try { + connection.close(); + log.debug("Connection closed."); + } catch (JMSException e) { + log.warn("Exception while closing ActiveMQMessageBus Connection", e); + } + try { + connectionFactory.close(); + } catch (Exception e) { + log.warn("Exception while closing ActiveMQMessageBus connectionFactory", e); + } + } @Override @@ -376,23 +423,14 @@ private Destination getDestination(String destinationID, Session session) { if (parts.length == 1) { destination = session.createTopic(destinationID); } else if (parts.length == 2) { - switch (parts[0]) { - case "topic": - destination = session.createTopic(parts[1]); - break; - case "queue": - destination = session.createQueue(parts[1]); - break; - case "temporary-queue": - destination = session.createTemporaryQueue(); - break; - case "temporary-topic": - destination = session.createTemporaryTopic(); - break; - default: - throw new CoordinationLayerException("Unable to create destination '" + - destination + "'. Unknown type."); - } + destination = switch (parts[0]) { + case "topic" -> session.createTopic(parts[1]); + case "queue" -> session.createQueue(parts[1]); + case "temporary-queue" -> session.createTemporaryQueue(); + case "temporary-topic" -> session.createTemporaryTopic(); + default -> throw new CoordinationLayerException("Unable to create destination '" + + destination + "'. Unknown type."); + }; } } catch (JMSException e) { throw new CoordinationLayerException("Could not create destination '" + destinationID + "'", e); diff --git a/bitrepository-core/src/main/java/org/bitrepository/protocol/messagebus/ReceivedMessageHandler.java b/bitrepository-core/src/main/java/org/bitrepository/protocol/messagebus/ReceivedMessageHandler.java index 014ec6f4e..a8e1d3401 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/protocol/messagebus/ReceivedMessageHandler.java +++ b/bitrepository-core/src/main/java/org/bitrepository/protocol/messagebus/ReceivedMessageHandler.java @@ -31,6 +31,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.Closeable; import java.math.BigInteger; import java.util.HashMap; import java.util.List; @@ -42,7 +43,7 @@ /** * Takes care of handling the further processing by the listeners in separated thread. */ -public class ReceivedMessageHandler { +public class ReceivedMessageHandler implements Closeable { private final Logger log = LoggerFactory.getLogger(getClass()); private final ExecutorModel executorModel; private final ThreadFactory threadFactory = new DefaultThreadFactory("ReceivedMessageHandler-", Thread.NORM_PRIORITY, false); diff --git a/bitrepository-core/src/test/java/org/bitrepository/pillar/integration/ArtemisFixedPortContainer.java b/bitrepository-core/src/test/java/org/bitrepository/pillar/integration/ArtemisFixedPortContainer.java new file mode 100644 index 000000000..17832087d --- /dev/null +++ b/bitrepository-core/src/test/java/org/bitrepository/pillar/integration/ArtemisFixedPortContainer.java @@ -0,0 +1,21 @@ +package org.bitrepository.pillar.integration; + +import org.testcontainers.activemq.ArtemisContainer; +import org.testcontainers.containers.InternetProtocol; +import org.testcontainers.utility.DockerImageName; + +public class ArtemisFixedPortContainer extends ArtemisContainer { + + public ArtemisFixedPortContainer(final String image) { + super(image); + } + + public ArtemisFixedPortContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + } + + public ArtemisFixedPortContainer withFixedExposedPort(int hostPort, int containerPort, InternetProtocol protocol) { + super.addFixedExposedPort(hostPort, containerPort, protocol); + return this; + } +} diff --git a/bitrepository-core/src/test/java/org/bitrepository/pillar/integration/PostgresFixedPortContainer.java b/bitrepository-core/src/test/java/org/bitrepository/pillar/integration/PostgresFixedPortContainer.java new file mode 100644 index 000000000..fe651f22a --- /dev/null +++ b/bitrepository-core/src/test/java/org/bitrepository/pillar/integration/PostgresFixedPortContainer.java @@ -0,0 +1,22 @@ +package org.bitrepository.pillar.integration; + +import org.testcontainers.containers.InternetProtocol; +import org.testcontainers.postgresql.PostgreSQLContainer; +import org.testcontainers.utility.DockerImageName; + +public class PostgresFixedPortContainer extends PostgreSQLContainer { + + public PostgresFixedPortContainer(final String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public PostgresFixedPortContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + } + + public PostgresFixedPortContainer withFixedExposedPort(int hostPort, int containerPort, InternetProtocol protocol) { + super.addFixedExposedPort(hostPort, containerPort, protocol); + return this; + } + +} diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/IntegrationTest.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/IntegrationTest.java index a5b86a837..9e1ea13f0 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/IntegrationTest.java +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/IntegrationTest.java @@ -25,15 +25,18 @@ package org.bitrepository.protocol; import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.read.ListAppender; import ch.qos.logback.core.util.StatusPrinter; import jakarta.jms.JMSException; +import org.apache.commons.lang3.exception.UncheckedException; import org.bitrepository.SuiteInfo; import org.bitrepository.SuiteInfoParameterResolver; import org.bitrepository.common.settings.Settings; import org.bitrepository.common.settings.TestSettingsProvider; import org.bitrepository.common.utils.SettingsUtils; import org.bitrepository.common.utils.TestFileHelper; -import org.bitrepository.protocol.bus.LocalActiveMQBroker; import org.bitrepository.protocol.bus.MessageReceiver; import org.bitrepository.protocol.fileexchange.HttpServerConfiguration; import org.bitrepository.protocol.http.EmbeddedHttpServer; @@ -43,6 +46,7 @@ import org.bitrepository.protocol.security.DummySecurityManager; import org.bitrepository.protocol.security.SecurityManager; import org.bitrepository.protocol.utils.TestWatcherExtension; +import org.bitrepository.settings.repositorysettings.ProtocolSettings; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -51,37 +55,53 @@ import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; +import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +/** + * Abstract base class for integration tests that manages shared infrastructure and test lifecycle hooks. + * This class initializes and tears down common resources such as message brokers, HTTP servers, and security managers + * at the suite level, while providing method-level setup and verification steps for individual tests. + * Subclasses can extend this class to define component-under-test initialization, custom receiver registration, + * and post-execution verification logic. The test environment is configurable via system properties to control + * the use of embedded message buses and HTTP servers. Logging is intercepted during method execution to capture + * events for failure diagnostics. + */ @TestInstance(TestInstance.Lifecycle.PER_CLASS) @ExtendWith(SuiteInfoParameterResolver.class) public abstract class IntegrationTest { - public static LocalActiveMQBroker broker; - public static EmbeddedHttpServer server; - public static HttpServerConfiguration httpServerConfiguration; - public static MessageBus messageBus; - private MessageReceiverManager receiverManager; + public EmbeddedHttpServer server; + public HttpServerConfiguration httpServerConfiguration; + public MessageBus messageBus; + protected static String alarmDestinationID; protected static MessageReceiver alarmReceiver; protected static SecurityManager securityManager; protected static Settings settingsForCUT; protected static Settings settingsForTestClient; protected static String collectionID; - protected String nonDefaultFileId; protected static String defaultFileId; protected static URL defaultFileUrl; protected static String defaultDownloadFileAddress; protected static String defaultUploadFileAddress; + private static List> appenders; + + protected MessageReceiverManager receiverManager; + protected String nonDefaultFileId; protected String defaultAuditInformation; - + @RegisterExtension - TestWatcherExtension testWatcher = new TestWatcherExtension(); + protected TestWatcherExtension testWatcher = new TestWatcherExtension(); protected String testMethodName; - + + private ListAppender appender; + @BeforeAll public void initializeSuite(SuiteInfo testInfo) { settingsForCUT = loadSettings(getComponentID()); @@ -89,49 +109,89 @@ public void initializeSuite(SuiteInfo testInfo) { makeUserSpecificSettings(settingsForCUT); makeUserSpecificSettings(settingsForTestClient); httpServerConfiguration = - new HttpServerConfiguration(settingsForTestClient.getReferenceSettings().getFileExchangeSettings()); + new HttpServerConfiguration(settingsForTestClient.getReferenceSettings().getFileExchangeSettings()); collectionID = settingsForTestClient.getCollections().get(0).getID(); - securityManager = createSecurityManager(); defaultFileId = "DefaultFile"; + constructDefaultFileUrls(); + setupMessageBus(); + } + + protected Settings loadSettings(String componentID) { + return TestSettingsProvider.reloadSettings(componentID); + } + + protected String getComponentID() { + return getClass().getSimpleName(); + } + + private void makeUserSpecificSettings(Settings settings) { + ProtocolSettings protocolSettings = settings.getRepositorySettings().getProtocolSettings(); + protocolSettings.setCollectionDestination(settings.getCollectionDestination() + getTopicPostfix()); + protocolSettings.setAlarmDestination(settings.getAlarmDestination() + getTopicPostfix()); + } + + protected SecurityManager createSecurityManager() { + return new DummySecurityManager(); + } + + private void constructDefaultFileUrls() { try { defaultFileUrl = httpServerConfiguration.getURL(TestFileHelper.DEFAULT_FILE_ID); defaultDownloadFileAddress = defaultFileUrl.toExternalForm(); defaultUploadFileAddress = defaultFileUrl.toExternalForm() + "-" + defaultFileId; } catch (MalformedURLException e) { - throw new RuntimeException("Failed to construct default file URLs for test setup", e); + throw new UncheckedException(e); } - initMessagebus(); } - + /** - * May be extended by subclasses needing to have their receivers managed. Remember to still call - * super.registerReceivers() when overriding + * Hooks up the message bus. */ - protected void registerMessageReceivers() { - alarmReceiver = new MessageReceiver(settingsForCUT.getAlarmDestination()); - addReceiver(alarmReceiver); + protected void setupMessageBus() { + if (useEmbeddedMessageBus()) { + if (messageBus == null) { + messageBus = new SimpleMessageBus(); + } + MessageBusManager.injectCustomMessageBus(MessageBusManager.DEFAULT_MESSAGE_BUS, messageBus); + if (settingsForTestClient != null) { + MessageBusManager.injectCustomMessageBus(settingsForTestClient.getComponentID(), messageBus); + } + if (settingsForCUT != null) { + MessageBusManager.injectCustomMessageBus(settingsForCUT.getComponentID(), messageBus); + } + } } - protected void addReceiver(MessageReceiver receiver) { - receiverManager.addReceiver(receiver); + /** + * Returns the postfix string to use when accessing user specific topics, which is the mechanism we use in the + * bit repository tests. + * + * @return The string to postfix all topix names with. + */ + protected String getTopicPostfix() { + return "-" + System.getProperty("user.name"); } - public void initMessagebus() { - setupMessageBus(); + /** + * Indicated whether an embedded active MQ should be started and used + */ + public boolean useEmbeddedMessageBus() { + return System.getProperty("useEmbeddedMessageBus", "true").equals("true"); } - @AfterAll - public void shutdownSuite() { - teardownMessageBus(); - teardownHttpServer(); + @BeforeEach + public void logTestStart(TestInfo testInfo) { + Class aClass = testInfo.getTestClass().orElse(null); + String displayName = testInfo.getDisplayName(); + System.out.println("Running Integration Test " + aClass + "#" + displayName); } /** * Defines the standard BitRepositoryCollection configuration */ @BeforeEach - public final void beforeMethod(TestInfo testInfo) { + public void beforeMethod(TestInfo testInfo) { testMethodName = testInfo.getTestMethod().get().getName(); setupSettings(); nonDefaultFileId = TestFileHelper.createUniquePrefix(testMethodName); @@ -140,44 +200,9 @@ public final void beforeMethod(TestInfo testInfo) { registerMessageReceivers(); messageBus.setCollectionFilter(List.of()); messageBus.setComponentFilter(List.of()); - receiverManager.startListeners(); initializeCUT(); - } - - - protected void initializeCUT() { - } - - @AfterEach - public final void afterMethod() { - if (receiverManager != null) { - receiverManager.stopListeners(); - } - if (testWatcher.isTestSuccessful()) { - afterMethodVerification(); - } - shutdownCUT(); - } - - /** - * May be used by specific tests for general verification when the test method has finished. Will only be run - * if the test has passed (so far). - */ - protected void afterMethodVerification() { - receiverManager.checkNoMessagesRemainInReceivers(); - } - - /** - * Purges all messages from the receivers. - */ - protected void clearReceivers() { - receiverManager.clearMessagesInReceivers(); - } - - /** - * May be overridden by specific tests wishing to do stuff. Remember to call super if this is overridden. - */ - protected void shutdownCUT() { + receiverManager.startListeners(); + appender = hookLogger(); } /** @@ -187,22 +212,48 @@ protected void setupSettings() { settingsForCUT = loadSettings(getComponentID()); makeUserSpecificSettings(settingsForCUT); SettingsUtils.initialize(settingsForCUT); - + alarmDestinationID = settingsForCUT.getRepositorySettings().getProtocolSettings().getAlarmDestination(); - + settingsForTestClient = loadSettings(testMethodName); makeUserSpecificSettings(settingsForTestClient); } - protected Settings loadSettings(String componentID) { - return TestSettingsProvider.reloadSettings(componentID); + /** + * May be extended by subclasses needing to have their receivers managed. Remember to still call + * super.registerReceivers() when overriding + */ + protected void registerMessageReceivers() { + alarmReceiver = addReceiver(new MessageReceiver(settingsForCUT.getAlarmDestination())); + } + + protected void initializeCUT() { } - private void makeUserSpecificSettings(Settings settings) { - settings.getRepositorySettings().getProtocolSettings() - .setCollectionDestination(settings.getCollectionDestination() + getTopicPostfix()); - settings.getRepositorySettings().getProtocolSettings() - .setAlarmDestination(settings.getAlarmDestination() + getTopicPostfix()); + private static ListAppender hookLogger() { + // get Logback Logger + var fooLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + + // create and start a ListAppender + ListAppender listAppender = new ListAppender<>(); + listAppender.start(); + + //Save the appenders and detach them + appenders = new ArrayList<>(); + Iterator> iterator = fooLogger.iteratorForAppenders(); + while (iterator.hasNext()) { + Appender next = iterator.next(); + fooLogger.detachAppender(next); + appenders.add(next); + } + // add the appender to the logger + fooLogger.addAppender(listAppender); + return listAppender; + } + + protected MessageReceiver addReceiver(MessageReceiver receiver) { + receiverManager.addReceiver(receiver); + return receiver; } @BeforeEach @@ -212,60 +263,64 @@ public void writeLogStatus() { StatusPrinter.print(lc); } } + + @AfterEach + public final void afterMethod() { + if (receiverManager != null) { + receiverManager.stopListeners(); + } + if (testWatcher.isTestSuccessful()) { + afterMethodVerification(); + } + shutdownCUT(); + if (!testWatcher.isTestSuccessful()) { + replayLoggedEvents(); + } + } /** - * Indicated whether an embedded active MQ should be started and used + * May be used by specific tests for general verification when the test method has finished. Will only be run + * if the test has passed (so far). */ - public boolean useEmbeddedMessageBus() { - return System.getProperty("useEmbeddedMessageBus", "true").equals("true"); + protected void afterMethodVerification() { + receiverManager.checkNoMessagesRemainInReceivers(); } /** - * Indicated whether an embedded http server should be started and used + * May be overridden by specific tests wishing to do stuff. Remember to call super if this is overridden. */ - public boolean useEmbeddedHttpServer() { - return System.getProperty("useEmbeddedHttpServer", "false").equals("true"); + protected void shutdownCUT() { } - /** - * Hooks up the message bus. - */ - protected void setupMessageBus() { - if (useEmbeddedMessageBus()) { - if (messageBus == null) { - messageBus = new SimpleMessageBus(); - } - MessageBusManager.injectCustomMessageBus(MessageBusManager.DEFAULT_MESSAGE_BUS, messageBus); - if (settingsForTestClient != null) { - MessageBusManager.injectCustomMessageBus(settingsForTestClient.getComponentID(), messageBus); - } - if (settingsForCUT != null) { - MessageBusManager.injectCustomMessageBus(settingsForCUT.getComponentID(), messageBus); + private void replayLoggedEvents() { + for (ILoggingEvent loggingEvent : appender.list) { + for (Appender appender : appenders) { + appender.doAppend(loggingEvent); } } } + @AfterAll + public void shutdownSuite() { + teardownMessageBus(); + teardownHttpServer(); + } + /** * Shutdown the message bus. */ - private void teardownMessageBus() { - MessageBusManager.clear(); - if (messageBus != null) { - try { - messageBus.close(); - messageBus = null; - } catch (JMSException e) { - throw new RuntimeException(e); - } - } - - if (broker != null) { - try { - broker.stop(); - broker = null; - } catch (Exception e) { - // No reason to pollute the test output with this + protected void teardownMessageBus() { + if (useEmbeddedMessageBus()) { + MessageBusManager.clear(); + if (messageBus != null) { + try { + messageBus.close(); + messageBus = null; + } catch (JMSException e) { + throw new RuntimeException(e); + } } + } } @@ -279,24 +334,20 @@ protected void teardownHttpServer() { } /** - * Returns the postfix string to use when accessing user specific topics, which is the mechanism we use in the - * bit repository tests. - * - * @return The string to postfix all topix names with. + * Indicated whether an embedded http server should be started and used */ - protected String getTopicPostfix() { - return "-" + System.getProperty("user.name"); + public boolean useEmbeddedHttpServer() { + return System.getProperty("useEmbeddedHttpServer", "false").equals("true"); } - protected String getComponentID() { - return getClass().getSimpleName(); + /** + * Purges all messages from the receivers. + */ + protected void clearReceivers() { + receiverManager.clearMessagesInReceivers(); } protected String createDate() { return Long.toString(System.currentTimeMillis()); } - - protected SecurityManager createSecurityManager() { - return new DummySecurityManager(); - } } \ No newline at end of file diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/MessageCreationTest.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/MessageCreationTest.java index 8df1bd1a8..93718c708 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/MessageCreationTest.java +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/MessageCreationTest.java @@ -24,7 +24,7 @@ */ package org.bitrepository.protocol; -import java.io.ByteArrayInputStream; +import jakarta.xml.bind.JAXBException; import org.apache.commons.io.IOUtils; import org.bitrepository.bitrepositorymessages.AlarmMessage; import org.bitrepository.bitrepositorymessages.GetChecksumsFinalResponse; @@ -36,13 +36,13 @@ import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBException; import javax.xml.namespace.NamespaceContext; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/MessageReceiverManager.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/MessageReceiverManager.java index 99cda6a66..63f155bce 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/MessageReceiverManager.java +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/MessageReceiverManager.java @@ -30,7 +30,7 @@ /** * Takes care of the receiver bookkeeping in connect with test setup and testdown. */ -public class MessageReceiverManager { +public class MessageReceiverManager implements AutoCloseable{ private final List messageReceivers = new LinkedList<>(); private final MessageBus messageBus; @@ -68,4 +68,11 @@ public void clearMessagesInReceivers() { receiver.clearMessages(); } } + + @Override + public void close() throws InterruptedException { + for (MessageReceiver receiver : messageReceivers) { + receiver.close(); + } + } } \ No newline at end of file diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/ActiveMQMessageBusIT.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/ActiveMQMessageBusIT.java new file mode 100644 index 000000000..4bd7cbd0b --- /dev/null +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/ActiveMQMessageBusIT.java @@ -0,0 +1,219 @@ +/* + * #%L + * Bitrepository Core + * %% + * Copyright (C) 2010 - 2015 The State and University Library, The Royal Library and The State Archives, Denmark + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package org.bitrepository.protocol.bus; + +import jakarta.jms.Message; +import jakarta.jms.MessageListener; +import org.bitrepository.bitrepositorymessages.DeleteFileRequest; +import org.bitrepository.bitrepositorymessages.IdentifyPillarsForDeleteFileRequest; +import org.bitrepository.bitrepositorymessages.IdentifyPillarsForDeleteFileResponse; +import org.bitrepository.protocol.activemq.ActiveMQMessageBus; +import org.bitrepository.protocol.message.ExampleMessageFactory; +import org.bitrepository.protocol.messagebus.MessageBusManager; +import org.bitrepository.settings.repositorysettings.MessageBusConfiguration; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.testcontainers.activemq.ArtemisContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.TimeUnit; + +import static org.bitrepository.common.utils.AllureTestUtils.addDescription; +import static org.bitrepository.common.utils.AllureTestUtils.addStep; + + +/** + * Runs the GeneralMessageBusTest using a LocalActiveMQBroker and a suitable + * MessageBus based on TestContainers. Regression tests use Allure to generate reports. + */ +@Testcontainers +class ActiveMQMessageBusIT extends GeneralMessageBusIT { + + @Container + static ArtemisContainer activemqContainer = new ArtemisContainer("apache/artemis:2.55.0") + .withEnv("ANONYMOUS_LOGIN","true") + ; + + private MessageBusConfiguration messageBusConfig; + + @Override + protected void setupMessageBus() { + activemqContainer.start(); + while (!activemqContainer.isRunning()) { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + messageBusConfig = new MessageBusConfiguration(); + messageBusConfig.setURL(activemqContainer.getBrokerUrl()); + messageBusConfig.setName(activemqContainer.getContainerName()); + settingsForTestClient.getRepositorySettings() + .getProtocolSettings() + .setMessageBusConfiguration(messageBusConfig); + + + messageBus = new ActiveMQMessageBus(settingsForTestClient, securityManager); + MessageBusManager.clear(); + MessageBusManager.injectCustomMessageBus(MessageBusManager.DEFAULT_MESSAGE_BUS, messageBus); + } + + @Override + public boolean useEmbeddedMessageBus() { + return false; + } + + @Test + @Tag("regressiontest") + final void collectionFilterTest() throws Exception { + addDescription("Test that message bus filters identify requests to other collection, i.e. ignores these."); + addStep(""" + Send an identify request with a undefined 'Collection' header property, \ + i.e. this identify requests should be handled by everybody.""", + "Verify that the message bus accepts this message."); + String myCollectionID = "MyCollection"; + messageBus.setCollectionFilter(List.of(myCollectionID)); + String collectionDestination = settingsForTestClient.getCollectionDestination(); + + try (RawMessagebus rawMessagebus = new RawMessagebus(messageBusConfig)) { + var identifyRequest = ExampleMessageFactory.createMessage(IdentifyPillarsForDeleteFileRequest.class); + identifyRequest.setCollectionID(myCollectionID); + jakarta.jms.Message msg = rawMessagebus.createMessage(identifyRequest); + rawMessagebus.addHeader(msg, + identifyRequest.getClass().getSimpleName(), + identifyRequest.getReplyTo(), + null, + identifyRequest.getCorrelationID()); + + rawMessagebus.sendMessage(collectionDestination, msg); + collectionReceiver.waitForMessage(identifyRequest.getClass(), identifyRequest.getCorrelationID()); + + addStep("Send an identify request with the 'Collection' header property set to my collection", + "Verify that the request bus accepts this message."); + msg.setStringProperty(ActiveMQMessageBus.COLLECTION_ID_KEY, myCollectionID); + rawMessagebus.sendMessage(collectionDestination, msg); + collectionReceiver.waitForMessage(identifyRequest.getClass(), identifyRequest.getCorrelationID()); + + addStep("Send an invalid message with the 'Receiver' header property set to another specific component", + "Verify that the message bus ignores this before parsing the message."); + msg.setStringProperty(ActiveMQMessageBus.COLLECTION_ID_KEY, "OtherCollection"); + rawMessagebus.sendMessage(collectionDestination, msg); + collectionReceiver.checkNoMessageIsReceived(identifyRequest.getClass()); + } + } + + @Test + @Tag("regressiontest") + final void sendMessageToSpecificComponentTest() throws Exception { + addDescription("Test that message bus correct uses the 'to' header property to indicated that the message " + + "is meant for a specific component"); + addStep("Send a message with the 'Recipient' parameter set to at specific component", + "The MESSAGE_TO_KEY "); + String receiverID = "specificReceiver"; + final BlockingQueue messageList = new LinkedBlockingDeque<>(); + try (RawMessagebus rawMessagebus = new RawMessagebus(messageBusConfig)) { + rawMessagebus.addListener(settingsForTestClient.getCollectionDestination(), + (MessageListener) messageList::add); + IdentifyPillarsForDeleteFileRequest messageToSend = + ExampleMessageFactory.createMessage(IdentifyPillarsForDeleteFileRequest.class); + messageToSend.setDestination(settingsForTestClient.getCollectionDestination()); + messageToSend.setTo(receiverID); + messageBus.sendMessage(messageToSend); + Message receivedMessage = messageList.poll(3, TimeUnit.SECONDS); + Assertions.assertNotNull(receivedMessage); + Assertions.assertEquals(receiverID, receivedMessage.getStringProperty(ActiveMQMessageBus.MESSAGE_TO_KEY)); + } + } + + @Test + @Tag("regressiontest") + final void toFilterTest() throws Exception { + addDescription("Test that message bus filters identify requests to other components, i.e. ignores these."); + addStep("Send an identify request with a undefined 'To' header property, " + + "i.e. this identify requests should be handled by all components.", + "Verify that the identify request bus accepts this identify request."); + messageBus.setComponentFilter(Collections.singletonList(settingsForTestClient.getComponentID())); + String collectionDestination = settingsForTestClient.getCollectionDestination(); + + try (RawMessagebus rawMessagebus = new RawMessagebus(messageBusConfig)) { + var identifyRequest = ExampleMessageFactory.createMessage(IdentifyPillarsForDeleteFileRequest.class); + + identifyRequest.setDestination(collectionDestination); + Message msg = rawMessagebus.createMessage(identifyRequest); + rawMessagebus.addHeader(msg, + identifyRequest.getClass().getSimpleName(), + identifyRequest.getReplyTo(), + null, + identifyRequest.getCorrelationID()); + rawMessagebus.sendMessage(collectionDestination, msg); + collectionReceiver.waitForMessage(identifyRequest.getClass(), identifyRequest.getCorrelationID()); + + addStep("Send an identify request with the 'To' header property set to this component", + "Verify that the identify request bus accepts this identify request."); + msg.setStringProperty(ActiveMQMessageBus.MESSAGE_TO_KEY, settingsForTestClient.getComponentID()); + rawMessagebus.sendMessage(collectionDestination, msg); + collectionReceiver.waitForMessage(identifyRequest.getClass(), identifyRequest.getCorrelationID()); + + addStep("Send an invalid identify request with the 'To' header property set to another specific component", + "Verify that the identify request bus ignores this before parsing the identify request."); + msg.setStringProperty(ActiveMQMessageBus.MESSAGE_TO_KEY, "OtherComponent"); + rawMessagebus.sendMessage(collectionDestination, msg); + collectionReceiver.checkNoMessageIsReceived(identifyRequest.getClass()); + + addStep("Send an identify response with the 'To' header property set to another component", + "Verify that the message bus accepts this message."); + var identifyResponse = ExampleMessageFactory.createMessage(IdentifyPillarsForDeleteFileResponse.class); + identifyRequest.setDestination(collectionDestination); + Message response = rawMessagebus.createMessage(identifyResponse); + rawMessagebus.addHeader(response, + identifyResponse.getClass().getSimpleName(), + identifyResponse.getReplyTo(), + null, + identifyRequest.getCorrelationID()); + response.setStringProperty(ActiveMQMessageBus.MESSAGE_TO_KEY, "OtherComponent"); + rawMessagebus.sendMessage(collectionDestination, response); + collectionReceiver.waitForMessage(identifyResponse.getClass(), identifyRequest.getCorrelationID()); + + addStep("Send an non-identify request with the 'To' header property set to another component", + "Verify that the message bus accepts this message."); + var deleteFileRequest = ExampleMessageFactory.createMessage(DeleteFileRequest.class); + deleteFileRequest.setDestination(collectionDestination); + var deleteFileRequestMessage = rawMessagebus.createMessage(deleteFileRequest); + rawMessagebus.addHeader(deleteFileRequestMessage, + deleteFileRequest.getClass().getSimpleName(), + deleteFileRequest.getReplyTo(), + null, + identifyRequest.getCorrelationID()); + response.setStringProperty(ActiveMQMessageBus.MESSAGE_TO_KEY, "OtherComponent"); + rawMessagebus.sendMessage(collectionDestination, deleteFileRequestMessage); + collectionReceiver.waitForMessage(deleteFileRequest.getClass(), identifyRequest.getCorrelationID()); + } + } +} \ No newline at end of file diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/ActiveMQMessageBusTest.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/ActiveMQMessageBusTest.java deleted file mode 100644 index 139c7dbf0..000000000 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/ActiveMQMessageBusTest.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * #%L - * Bitrepository Core - * %% - * Copyright (C) 2010 - 2015 The State and University Library, The Royal Library and The State Archives, Denmark - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . - * #L% - */ -package org.bitrepository.protocol.bus; - -import jakarta.jms.Message; -import jakarta.jms.MessageListener; -import org.bitrepository.bitrepositorymessages.DeleteFileRequest; -import org.bitrepository.bitrepositorymessages.IdentifyPillarsForDeleteFileRequest; -import org.bitrepository.bitrepositorymessages.IdentifyPillarsForDeleteFileResponse; -import org.bitrepository.protocol.ProtocolComponentFactory; -import org.bitrepository.protocol.activemq.ActiveMQMessageBus; -import org.bitrepository.protocol.message.ExampleMessageFactory; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.TimeUnit; - -import static org.bitrepository.common.utils.AllureTestUtils.addDescription; -import static org.bitrepository.common.utils.AllureTestUtils.addStep; - - -/** - * Runs the GeneralMessageBusTest using a LocalActiveMQBroker (if useEmbeddedMessageBus is true) and a suitable - * MessageBus based on settingsForTestClient. Regression tests utilized that uses Allure to generate reports. - */ - -class ActiveMQMessageBusTest extends GeneralMessageBusTest { - - @Override - protected void setupMessageBus() { - if (useEmbeddedMessageBus() && broker == null) { - broker = new LocalActiveMQBroker(settingsForTestClient.getMessageBusConfiguration()); - broker.start(); - } - messageBus = new MessageBusWrapper(ProtocolComponentFactory.getInstance().getMessageBus( - settingsForTestClient, securityManager)); - - } - - @Test - @Tag("regressiontest") - final void collectionFilterTest() throws Exception { - addDescription("Test that message bus filters identify requests to other collection, eg. ignores these."); - addStep("Send an identify request with a undefined 'Collection' header property, " + - "eg. this identify requests should be handled by everybody.", - "Verify that the message bus accepts this message."); - String myCollectionID = "MyCollection"; - messageBus.setCollectionFilter(Arrays.asList(myCollectionID)); - RawMessagebus rawMessagebus = new RawMessagebus( - settingsForTestClient.getMessageBusConfiguration(), - securityManager); - IdentifyPillarsForDeleteFileRequest identifyRequest = - ExampleMessageFactory.createMessage(IdentifyPillarsForDeleteFileRequest.class); - identifyRequest.setCollectionID(myCollectionID); - jakarta.jms.Message msg = rawMessagebus.createMessage(identifyRequest); - rawMessagebus.addHeader(msg, identifyRequest.getClass().getSimpleName(), identifyRequest.getReplyTo(), - null, - identifyRequest.getCorrelationID()); - rawMessagebus.sendMessage(settingsForTestClient.getCollectionDestination(), msg); - collectionReceiver.waitForMessage(IdentifyPillarsForDeleteFileRequest.class); - - addStep("Send an identify request with the 'Collection' header property set to my collection", - "Verify that the request bus accepts this message."); - msg.setStringProperty(ActiveMQMessageBus.COLLECTION_ID_KEY, myCollectionID); - rawMessagebus.sendMessage(settingsForTestClient.getCollectionDestination(), msg); - collectionReceiver.waitForMessage(IdentifyPillarsForDeleteFileRequest.class); - - addStep("Send an invalid message with the 'Receiver' header property set to another specific component", - "Verify that the message bus ignores this before parsing the message."); - msg.setStringProperty(ActiveMQMessageBus.COLLECTION_ID_KEY, "OtherCollection"); - rawMessagebus.sendMessage(settingsForTestClient.getCollectionDestination(), msg); - collectionReceiver.checkNoMessageIsReceived(IdentifyPillarsForDeleteFileRequest.class); - } - - @Test - @Tag("regressiontest") - final void sendMessageToSpecificComponentTest() throws Exception { - addDescription("Test that message bus correct uses the 'to' header property to indicated that the message " + - "is meant for a specific component"); - addStep("Send a message with the 'Recipient' parameter set to at specific component", - "The MESSAGE_TO_KEY "); - String receiverID = "specificReceiver"; - final BlockingQueue messageList = new LinkedBlockingDeque<>(); - RawMessagebus rawMessagebus = new RawMessagebus( - settingsForTestClient.getMessageBusConfiguration(), - securityManager); - rawMessagebus.addListener(settingsForTestClient.getCollectionDestination(), new MessageListener() { - @Override - public void onMessage(Message message) { - messageList.add(message); - } - }); - IdentifyPillarsForDeleteFileRequest messageToSend = - ExampleMessageFactory.createMessage(IdentifyPillarsForDeleteFileRequest.class); - messageToSend.setDestination(settingsForTestClient.getCollectionDestination()); - messageToSend.setTo(receiverID); - messageBus.sendMessage(messageToSend); - Message receivedMessage = messageList.poll(3, TimeUnit.SECONDS); - Assertions.assertEquals(receiverID, receivedMessage.getStringProperty(ActiveMQMessageBus.MESSAGE_TO_KEY)); - } - - @Test - @Tag("regressiontest") - final void toFilterTest() throws Exception { - addDescription("Test that message bus filters identify requests to other components, eg. ignores these."); - addStep("Send an identify request with a undefined 'To' header property, " + - "eg. this identify requests should be handled by all components.", - "Verify that the identify request bus accepts this identify request."); - messageBus.setComponentFilter(Arrays.asList(settingsForTestClient.getComponentID())); - RawMessagebus rawMessagebus = new RawMessagebus( - settingsForTestClient.getMessageBusConfiguration(), - securityManager); - IdentifyPillarsForDeleteFileRequest identifyRequest = - ExampleMessageFactory.createMessage(IdentifyPillarsForDeleteFileRequest.class); - identifyRequest.setDestination(settingsForTestClient.getCollectionDestination()); - jakarta.jms.Message msg = rawMessagebus.createMessage(identifyRequest); - rawMessagebus.addHeader(msg, identifyRequest.getClass().getSimpleName(), identifyRequest.getReplyTo(), - null, - identifyRequest.getCorrelationID()); - rawMessagebus.sendMessage(settingsForTestClient.getCollectionDestination(), msg); - collectionReceiver.waitForMessage(IdentifyPillarsForDeleteFileRequest.class); - - addStep("Send an identify request with the 'To' header property set to this component", - "Verify that the identify request bus accepts this identify request."); - msg.setStringProperty(ActiveMQMessageBus.MESSAGE_TO_KEY, settingsForTestClient.getComponentID()); - rawMessagebus.sendMessage(settingsForTestClient.getCollectionDestination(), msg); - collectionReceiver.waitForMessage(IdentifyPillarsForDeleteFileRequest.class); - - addStep("Send an invalid identify request with the 'To' header property set to another specific component", - "Verify that the identify request bus ignores this before parsing the identify request."); - msg.setStringProperty(ActiveMQMessageBus.MESSAGE_TO_KEY, "OtherComponent"); - rawMessagebus.sendMessage(settingsForTestClient.getCollectionDestination(), msg); - collectionReceiver.checkNoMessageIsReceived(IdentifyPillarsForDeleteFileRequest.class); - - addStep("Send an identify response with the 'To' header property set to another component", - "Verify that the message bus accepts this message."); - IdentifyPillarsForDeleteFileResponse identifyResponse = - ExampleMessageFactory.createMessage(IdentifyPillarsForDeleteFileResponse.class); - identifyRequest.setDestination(settingsForTestClient.getCollectionDestination()); - jakarta.jms.Message response = rawMessagebus.createMessage(identifyResponse); - rawMessagebus.addHeader(response, identifyResponse.getClass().getSimpleName(), identifyResponse.getReplyTo(), - null, - identifyRequest.getCorrelationID()); - response.setStringProperty(ActiveMQMessageBus.MESSAGE_TO_KEY, "OtherComponent"); - rawMessagebus.sendMessage(settingsForTestClient.getCollectionDestination(), response); - collectionReceiver.waitForMessage(IdentifyPillarsForDeleteFileResponse.class); - - addStep("Send an non-identify request with the 'To' header property set to another component", - "Verify that the message bus accepts this message."); - DeleteFileRequest request = - ExampleMessageFactory.createMessage(DeleteFileRequest.class); - request.setDestination(settingsForTestClient.getCollectionDestination()); - jakarta.jms.Message rq = rawMessagebus.createMessage(request); - rawMessagebus.addHeader(rq, request.getClass().getSimpleName(), request.getReplyTo(), - null, - identifyRequest.getCorrelationID()); - response.setStringProperty(ActiveMQMessageBus.MESSAGE_TO_KEY, "OtherComponent"); - rawMessagebus.sendMessage(settingsForTestClient.getCollectionDestination(), rq); - collectionReceiver.waitForMessage(DeleteFileRequest.class); - } -} \ No newline at end of file diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/GeneralMessageBusIT.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/GeneralMessageBusIT.java new file mode 100644 index 000000000..28af5d7cb --- /dev/null +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/GeneralMessageBusIT.java @@ -0,0 +1,203 @@ +/* + * #%L + * Bitmagasin integrationstest + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2010 The State and University Library, The Royal Library and The State Archives, Denmark + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package org.bitrepository.protocol.bus; + +import io.qameta.allure.Description; +import org.bitrepository.SuiteInfoParameterResolver; +import org.bitrepository.bitrepositorymessages.AlarmMessage; +import org.bitrepository.bitrepositorymessages.IdentifyPillarsForGetFileRequest; +import org.bitrepository.bitrepositorymessages.Message; +import org.bitrepository.protocol.IntegrationTest; +import org.bitrepository.protocol.MessageContext; +import org.bitrepository.protocol.message.ExampleMessageFactory; +import org.bitrepository.protocol.messagebus.MessageBusManager; +import org.bitrepository.protocol.messagebus.MessageListener; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.extension.ExtendWith; + +import jakarta.jms.JMSException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.Duration; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +import static org.bitrepository.common.utils.AllureTestUtils.addDescription; +import static org.bitrepository.common.utils.AllureTestUtils.addStep; + +/** + * Class for testing the interface with the message bus. + */ +@ExtendWith(SuiteInfoParameterResolver.class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +abstract class GeneralMessageBusIT extends IntegrationTest { + /** + * The time to wait when sending a message before it definitely should + * have been consumed by a listener. + */ + static final Duration TIME_FOR_WAIT = Duration.ofMillis(2500); + private final static int threadCount = 3; + + protected MessageReceiver collectionReceiver; + + protected static Logger log = LoggerFactory.getLogger(GeneralMessageBusIT.class); + + private int count = 0; + private final static String FINISH = "FINISH"; + private final BlockingQueue finishQueue = new LinkedBlockingQueue<>(1); + MultiMessageListener listener; + + + @Override + protected void registerMessageReceivers() { + super.registerMessageReceivers(); + collectionReceiver = addReceiver(new MessageReceiver(settingsForCUT.getCollectionDestination())); + } + + @Test + @Tag("regressiontest") + @Description(""" + Tests whether it is possible to create a message listener, \ + and then set it to listen to the topic. Then puts a message \ + on the topic for the message listener to find, and \ + tests whether it finds the correct message.""") + final void busActivityTest() throws Exception { + + addStep("Send a message to the topic", "No exceptions should be thrown"); + AlarmMessage message = ExampleMessageFactory.createMessage(AlarmMessage.class); + message.setDestination(alarmDestinationID); + messageBus.sendMessage(message); + + addStep("Wait for the message to be received", + "A message should be received"); + alarmReceiver.waitForMessage(message.getClass()); + } + + @Test + @Tag("regressiontest") + final void twoListenersForTopicTest() throws Exception { + addDescription("Verifies that two listeners on the same topic both receive the message"); + + addStep("Make a connection to the message bus and add two listeners", + "No exceptions should be thrown"); + MessageReceiver receiver1 = new MessageReceiver(alarmDestinationID); + addReceiver(receiver1); + messageBus.addListener(receiver1.getDestination(), receiver1.getMessageListener()); + MessageReceiver receiver2 = new MessageReceiver(alarmDestinationID); + addReceiver(receiver2); + messageBus.addListener(receiver2.getDestination(), receiver2.getMessageListener()); + + addStep("Send a message to the topic", "No exceptions should be thrown"); + AlarmMessage message = ExampleMessageFactory.createMessage(AlarmMessage.class); + message.setDestination(alarmDestinationID); + messageBus.sendMessage(message); + + addStep("Make sure both listeners received the message", + "Both listeners received the message, and it is identical"); + receiver1.waitForMessage(AlarmMessage.class); + receiver2.waitForMessage(AlarmMessage.class); + } + + @Test + @Tag("specificationonly") + final void messageBusFailoverTest() { + addDescription("Verifies that we can switch to at second message bus " + + "in the middle of a conversation, if the connection is lost. " + + "We should also be able to resume the conversation on the new " + + "message bus"); + } + + @Test + @Tag("specificationonly") + final void messageBusReconnectTest() { + addDescription("Test whether we are able to reconnect to the message " + + "bus if the connection is lost"); + } + + @Test + @Tag("regressiontest") + final void manyThreadsBeforeFinish() throws Exception { + addDescription("Tests whether it is possible to start the handling of many threads simultaneously."); + var identifyRequest = ExampleMessageFactory.createMessage(IdentifyPillarsForGetFileRequest.class); + listener = new MultiMessageListener(); + messageBus.addListener("BusActivityTest", listener); + identifyRequest.setDestination("BusActivityTest"); + + addStep("Send one message for each listener", + "When all have receiver, then they give respond on 'finishQueue'"); + for (int i = 0; i < threadCount; i++) { + messageBus.sendMessage(identifyRequest); + } + Assertions.assertEquals(FINISH, finishQueue.poll(TIME_FOR_WAIT.toMillis(), TimeUnit.MILLISECONDS)); + Assertions.assertEquals(threadCount, count); + } + + + /** + * Shutdown the message bus. + */ + @Override + protected void teardownMessageBus() { + MessageBusManager.clear(); + if (messageBus != null) { + try { + messageBus.close(); + messageBus = null; + } catch (JMSException e) { + log.warn("Failed to close messageBus", e); + } + } + } + + + protected class MultiMessageListener implements MessageListener { + private final BlockingQueue queue = new LinkedBlockingQueue<>(threadCount); + + @Override + public final void onMessage(Message message, MessageContext messageContext) { + try { + testIfFinished(); + Assertions.assertNotNull(queue.poll(TIME_FOR_WAIT.toMillis(), TimeUnit.MILLISECONDS)); + } catch (InterruptedException e) { + Assertions.fail("Should not throw an exception: ", e); + } + } + + private void testIfFinished() throws InterruptedException { + count++; + if (count >= threadCount) { + for (int i = 0; i < threadCount; i++) { + queue.put("Count '" + i + "'"); + } + finishQueue.put(FINISH); + } + } + } +} diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/GeneralMessageBusTest.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/GeneralMessageBusTest.java deleted file mode 100644 index 20c13da7e..000000000 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/GeneralMessageBusTest.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * #%L - * Bitmagasin integrationstest - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2010 The State and University Library, The Royal Library and The State Archives, Denmark - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . - * #L% - */ -package org.bitrepository.protocol.bus; - -import org.bitrepository.SuiteInfoParameterResolver; -import org.bitrepository.bitrepositorymessages.AlarmMessage; -import org.bitrepository.protocol.IntegrationTest; -import org.bitrepository.protocol.message.ExampleMessageFactory; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import java.util.List; - -import static org.bitrepository.common.utils.AllureTestUtils.addDescription; -import static org.bitrepository.common.utils.AllureTestUtils.addStep; - -/** - * Class for testing the interface with the message bus. - */ -@ExtendWith(SuiteInfoParameterResolver.class) -class GeneralMessageBusTest extends IntegrationTest { - protected static MessageReceiver collectionReceiver; - - @Override - protected void registerMessageReceivers() { - super.registerMessageReceivers(); - collectionReceiver = new MessageReceiver(settingsForCUT.getCollectionDestination()); - addReceiver(collectionReceiver); - } - - @AfterEach - void tearDown() { - messageBus.setComponentFilter(List.of()); - messageBus.setCollectionFilter(List.of()); - } - - @Test - @Tag("regressiontest") - final void busActivityTest() throws Exception { - addDescription("Tests whether it is possible to create a message listener, " + - "and then set it to listen to the topic. Then puts a message" + - "on the topic for the message listener to find, and" + - "tests whether it finds the correct message."); - - addStep("Send a message to the topic", "No exceptions should be thrown"); - AlarmMessage message = ExampleMessageFactory.createMessage(AlarmMessage.class); - message.setDestination(alarmDestinationID); - messageBus.sendMessage(message); - - addStep("Make sure both listeners received the message", - "Both listeners received the message, and it is identical"); - alarmReceiver.waitForMessage(message.getClass()); - } - - @Test - @Tag("regressiontest") - final void twoListenersForTopicTest() throws Exception { - addDescription("Verifies that two listeners on the same topic both receive the message"); - - addStep("Make a connection to the message bus and add two listeners", - "No exceptions should be thrown"); - MessageReceiver receiver1 = new MessageReceiver(alarmDestinationID); - addReceiver(receiver1); - messageBus.addListener(receiver1.getDestination(), receiver1.getMessageListener()); - MessageReceiver receiver2 = new MessageReceiver(alarmDestinationID); - addReceiver(receiver2); - messageBus.addListener(receiver2.getDestination(), receiver2.getMessageListener()); - - addStep("Send a message to the topic", "No exceptions should be thrown"); - AlarmMessage message = ExampleMessageFactory.createMessage(AlarmMessage.class); - message.setDestination(alarmDestinationID); - messageBus.sendMessage(message); - - addStep("Make sure both listeners received the message", - "Both listeners received the message, and it is identical"); - receiver1.waitForMessage(AlarmMessage.class); - receiver2.waitForMessage(AlarmMessage.class); - } - - @Test - @Tag("specificationonly") - final void messageBusFailoverTest() { - addDescription("Verifies that we can switch to at second message bus " + - "in the middle of a conversation, if the connection is lost. " + - "We should also be able to resume the conversation on the new " + - "message bus"); - } - - @Test - @Tag("specificationonly") - final void messageBusReconnectTest() { - addDescription("Test whether we are able to reconnect to the message " + - "bus if the connection is lost"); - } -} diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/MessageReceiver.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/MessageReceiver.java index d11bcbf53..ab66101f2 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/MessageReceiver.java +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/MessageReceiver.java @@ -16,8 +16,8 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public + * + * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * . * #L% @@ -35,15 +35,22 @@ import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; /** * May be added as listener to the message queue where it will store all received messages for later reading. * - * This makes it possible to add the asynchronize reception of messages to the otherwise sequential test cases. Eg. + * This makes it possible to add the asynchronize reception of messages to the otherwise sequential test cases. I.E. *
  * {@code}
  * public void test() {
@@ -59,12 +66,23 @@
  * }
  * 
*/ -public class MessageReceiver { +public class MessageReceiver implements AutoCloseable { private final Logger log = LoggerFactory.getLogger(this.getClass()); private final MessageModel messageModel = new MessageModel(); private final String destination; private final MessageListener messageListener; + private final ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor(); + + @Override + public void close() { + var actives = executorService.shutdownNow(); + try { + var allClosed = executorService.awaitTermination(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + //Not important, we are closing anyhow + } + } /** * @param destination The destination to use for the receiver. Primarily used for logging purposes. @@ -87,45 +105,88 @@ public void setFromFilter(Collection filter) { public MessageListener getMessageListener() { return messageListener; } - + /** - * Corresponds to the {@link #waitForMessage(Class, long, TimeUnit)} method with a default timeout of 10 second. + * Corresponds to the {@link #waitForMessage(Class, long, TimeUnit, String)} method with a default timeout of 10 second. */ - public T waitForMessage(Class messageType) { - return waitForMessage(messageType, 10, TimeUnit.SECONDS); + public T waitForMessage(Class messageType) { + return waitForMessage(messageType, 10, TimeUnit.SECONDS, null); } /** - * Waits for a message of the specified type to be received on the test message queue, when the message is + * Corresponds to the {@link #waitForMessage(Class, long, TimeUnit, String)} method with a default timeout of 10 second. + */ + public T waitForMessage(Class messageType, String correlationId) { + return waitForMessage(messageType, 10, TimeUnit.SECONDS, correlationId); + } + + public T waitForMessage(Class messageType, + long timeout, + TimeUnit unit) { + return waitForMessage(messageType, timeout, unit, null); + } + + /** + * Waits for a message of the specified type to be received on the test message queue, when the message is * received (or if one is already present) the message is returned. - * - * @param messageType The type of message to wait for. - * @param timeout The amount of time to wait for a message of this type. - * @param unit The unit of time for the timeout value + * + * @param messageType The type of message to wait for. + * @param timeout The amount of time to wait for a message of this type. + * @param unit The unit of time for the timeout value + * @param correlationID if not null, will wait for messages with this exact correlation ID, ignoring other messages * @return The received message or null if no message was received. */ - public T waitForMessage(Class messageType, long timeout, TimeUnit unit) { - long startWait = System.currentTimeMillis(); - T message; + public T waitForMessage(Class messageType, + long timeout, + TimeUnit unit, + final String correlationID) { + try { - message = messageModel.getMessageQueue(messageType).poll(timeout, unit); - } catch (InterruptedException e) { - throw new RuntimeException(e); // Should never happen + Callable objectCallable = () -> waitForMessageLoop(messageType, correlationID); + return executorService.invokeAny(List.of(objectCallable), + timeout, + unit); + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } catch (TimeoutException e) { + return Assertions.fail("Wait for " + + messageType.getSimpleName() + + " message timed out"); } - long waitTime = System.currentTimeMillis() - startWait; - if (message != null) { - log.debug("Read message after ({} ms): {}", waitTime, message); - } else { - log.info("Wait for {} message timed out ({} ms).", messageType.getSimpleName(), waitTime); - Assertions.fail("Wait for " + messageType.getSimpleName() + " message timed out (" + waitTime + " ms)."); + } + + + private T waitForMessageLoop(Class messageType, + final String correlationID) { + + while (true) { + T message; + try { + BlockingQueue messageQueue = messageModel.getMessageQueue(messageType); + message = messageQueue.poll(); + + if (message == null) { + Thread.sleep(1000); + continue; + } + if (correlationID == null || Objects.equals(message.getCorrelationID(), + correlationID)) { + return message; + } else { + messageQueue.put(message); + } + } catch (InterruptedException e) { + return null; + } } - return message; } - /** - * Verifies no message of the given type is received. - * @param messageType The type of message to wait for. - */ + + /** + * Verifies no message of the given type is received. + * + * @param messageType The type of message to wait for. + */ public void checkNoMessageIsReceived(Class messageType) { T message; try { @@ -141,15 +202,15 @@ public void checkNoMessageIsReceived(Class messageType) { /** * Verifies that no messages remain in any queues. */ - public void checkNoMessagesRemain() { + public void checkNoMessagesRemain() { StringBuilder outstandingMessages = new StringBuilder(); - for (BlockingQueue messageQueue:messageModel.getMessageQueues()) { + for (BlockingQueue messageQueue : messageModel.getMessageQueues()) { if (!messageQueue.isEmpty()) { while (!messageQueue.isEmpty()) { - outstandingMessages.append("\n" + messageQueue.poll()); + outstandingMessages.append("\n").append(messageQueue.poll()); } } - if (outstandingMessages.length() > 0 ) { + if (!outstandingMessages.isEmpty()) { String info = "The following messages haven't been handled by the testcase: " + outstandingMessages; log.warn(info); } @@ -159,22 +220,24 @@ public void checkNoMessagesRemain() { /** * Clears the message in the queue. */ - public void clearMessages() { - for (BlockingQueue messageQueue:messageModel.getMessageQueues()) { + public void clearMessages() { + for (BlockingQueue messageQueue : messageModel.getMessageQueues()) { if (!messageQueue.isEmpty()) { messageQueue.clear(); } } } - private class MessageModel { + private static class MessageModel { private final Map, BlockingQueue> messageMap = new HashMap<>(); private Collection pillarFilter; private void addMessage(T message) { - if (pillarFilter != null && !pillarFilter.contains(((Message)message).getFrom())) return; + if (pillarFilter != null && !pillarFilter.contains(((Message) message).getFrom())) { + return; + } @SuppressWarnings("unchecked") - BlockingQueue queue = (BlockingQueue)getMessageQueue(message.getClass()); + BlockingQueue queue = (BlockingQueue) getMessageQueue(message.getClass()); queue.add(message); } @@ -184,7 +247,7 @@ private synchronized BlockingQueue getMessageQueue(Class messageType) } @SuppressWarnings("unchecked") - BlockingQueue queue = (BlockingQueue)messageMap.get(messageType); + BlockingQueue queue = (BlockingQueue) messageMap.get(messageType); return queue; } diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/MultiThreadedMessageBusTest.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/MultiThreadedMessageBusTest.java deleted file mode 100644 index 1387d41ca..000000000 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/MultiThreadedMessageBusTest.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * #%L - * Bitmagasin integrationstest - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2010 The State and University Library, The Royal Library and The State Archives, Denmark - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * . - * #L% - */ -package org.bitrepository.protocol.bus; - -import org.bitrepository.SuiteInfoParameterResolver; -import org.bitrepository.bitrepositorymessages.IdentifyPillarsForGetFileRequest; -import org.bitrepository.bitrepositorymessages.Message; -import org.bitrepository.protocol.IntegrationTest; -import org.bitrepository.protocol.MessageContext; -import org.bitrepository.protocol.ProtocolComponentFactory; -import org.bitrepository.protocol.message.ExampleMessageFactory; -import org.bitrepository.protocol.messagebus.MessageListener; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; - -import static org.bitrepository.common.utils.AllureTestUtils.addDescription; -import static org.bitrepository.common.utils.AllureTestUtils.addStep; - -/** - * Class for testing the interface with the message bus. - */ -@ExtendWith(SuiteInfoParameterResolver.class) -class MultiThreadedMessageBusTest extends IntegrationTest { - /** - * The time to wait when sending a message before it definitely should - * have been consumed by a listener. - */ - static final int TIME_FOR_WAIT = 2500; - private final static int threadCount = 3; - private int count = 0; - private final static String FINISH = "FINISH"; - private final BlockingQueue finishQueue = new LinkedBlockingQueue<>(1); - MultiMessageListener listener; - - protected void setupMessageBus() { - if (useEmbeddedMessageBus() && broker == null) { - broker = new LocalActiveMQBroker(settingsForTestClient.getMessageBusConfiguration()); - broker.start(); - } - messageBus = new MessageBusWrapper(ProtocolComponentFactory.getInstance().getMessageBus( - settingsForTestClient, securityManager)); - - } - - @Test - @Tag("regressiontest") - final void manyTheadsBeforeFinish() throws Exception { - addDescription("Tests whether it is possible to start the handling of many threads simultaneously."); - IdentifyPillarsForGetFileRequest content = - ExampleMessageFactory.createMessage(IdentifyPillarsForGetFileRequest.class); - listener = new MultiMessageListener(); - messageBus.addListener("BusActivityTest", listener); - content.setDestination("BusActivityTest"); - - addStep("Send one message for each listener", - "When all have receiver, then they give respond on 'finishQueue'"); - for (int i = 0; i < threadCount; i++) { - messageBus.sendMessage(content); - } - Assertions.assertEquals(FINISH, finishQueue.poll(TIME_FOR_WAIT, TimeUnit.MILLISECONDS)); - Assertions.assertEquals(threadCount, count); - } - - @AfterEach - void removeListener() { - messageBus.removeListener("BusActivityTest", listener); - } - - protected class MultiMessageListener implements MessageListener { - private final BlockingQueue queue = new LinkedBlockingQueue<>(threadCount); - - @Override - public final void onMessage(Message message, MessageContext messageContext) { - try { - testIfFinished(); - Assertions.assertNotNull(queue.poll(TIME_FOR_WAIT, TimeUnit.MILLISECONDS)); - } catch (InterruptedException e) { - Assertions.fail("Should not throw an exception: ", e); - } - } - - private void testIfFinished() throws InterruptedException { - count++; - if (count >= threadCount) { - for (int i = 0; i < threadCount; i++) { - queue.put("Count '" + i + "'"); - } - finishQueue.put(FINISH); - } - } - } -} diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/RawMessagebus.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/RawMessagebus.java index 9c9cfe45d..b39fc7509 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/RawMessagebus.java +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/bus/RawMessagebus.java @@ -30,20 +30,19 @@ import jakarta.jms.MessageConsumer; import jakarta.jms.MessageProducer; import jakarta.jms.Session; -import org.bitrepository.protocol.activemq.ArtemisConnectionFactoryProvider; +import jakarta.xml.bind.JAXBException; import org.bitrepository.common.JaxbHelper; import org.bitrepository.protocol.CoordinationLayerException; import org.bitrepository.protocol.activemq.ActiveMQMessageBus; -import org.bitrepository.protocol.security.SecurityManager; +import org.bitrepository.protocol.activemq.ArtemisConnectionFactoryProvider; import org.bitrepository.settings.repositorysettings.MessageBusConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.xml.bind.JAXBException; import java.util.HashMap; import java.util.Map; -public class RawMessagebus { +public class RawMessagebus implements AutoCloseable { private final Logger log = LoggerFactory.getLogger(getClass()); private final Map destinations = new HashMap<>(); private final Map consumers = new HashMap<>(); @@ -51,10 +50,8 @@ public class RawMessagebus { private final Session consumerSession; private final Connection connection; public static final boolean TRANSACTED = false; - private final SecurityManager securityManager; - public RawMessagebus(MessageBusConfiguration messageBusConfiguration, SecurityManager securityManager) { - this.securityManager = securityManager; + public RawMessagebus(MessageBusConfiguration messageBusConfiguration) { var connectionFactory = ArtemisConnectionFactoryProvider.create(messageBusConfiguration); try { @@ -70,6 +67,12 @@ public RawMessagebus(MessageBusConfiguration messageBusConfiguration, SecurityMa } } + @Override + public void close() throws JMSException { + connection.setExceptionListener(null); + connection.close(); + } + public void addHeader(Message msg, String messageClass, String replyTo, @@ -81,7 +84,7 @@ public void addHeader(Message msg, msg.setJMSCorrelationID(correlationID); msg.setJMSReplyTo(getDestination(replyTo, producerSession)); } - + public Message createMessage(org.bitrepository.bitrepositorymessages.Message message) throws JMSException { JaxbHelper jaxbHelper = new JaxbHelper("xsd/", "BitRepositoryMessages.xsd"); String xmlContent; @@ -157,7 +160,9 @@ private MessageConsumer getMessageConsumer(String destinationID, jakarta.jms.Mes } return consumers.get(key); } + + private class MessageBusExceptionListener implements ExceptionListener { @Override public void onException(JMSException arg0) { diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/performancetest/MessageBusDelayTest.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/performancetest/MessageBusDelayTest.java index 42167e56b..bea96d68b 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/performancetest/MessageBusDelayTest.java +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/performancetest/MessageBusDelayTest.java @@ -79,27 +79,30 @@ public void performStatisticalAnalysisOfMessageDelay() throws Exception { + "on the delay between the sending and the retrieval of the message."); addStep("Setup the variables and connections for the test.", "Should connect to the messagebus."); MessageBus messageBus = MessageBusManager.getMessageBus(settings, securityManager); - MessageReceiver destinationReceiver; String destination = "DelayPerformanceTestDestination-" + Instant.now().toEpochMilli(); - destinationReceiver = new MessageReceiver("Performance test topic receiver"); - messageBus.addListener(destination, destinationReceiver.getMessageListener()); - - List delayList = new ArrayList<>(PERFORMANCE_COUNT); - AlarmMessage message = ExampleMessageFactory.createMessage(AlarmMessage.class); - message.setDestination(destination); - - addStep("Sending the message and calculating the time.", "Should be done '" + PERFORMANCE_COUNT + "' times."); - for (int i = 0; i < PERFORMANCE_COUNT; i++) { - Instant before = Instant.now(); - messageBus.sendMessage(message); - AlarmMessage received = destinationReceiver.waitForMessage(AlarmMessage.class, 100, TimeUnit.SECONDS); - Instant after = Instant.now(); - if (received == null) { - System.err.println("No message received within 100 seconds"); - } + List delayList; + try (MessageReceiver destinationReceiver = new MessageReceiver("Performance test topic receiver")) { + messageBus.addListener(destination, destinationReceiver.getMessageListener()); + + delayList = new ArrayList<>(PERFORMANCE_COUNT); + AlarmMessage message = ExampleMessageFactory.createMessage(AlarmMessage.class); + message.setDestination(destination); + + addStep("Sending the message and calculating the time.", + "Should be done '" + PERFORMANCE_COUNT + "' times."); + for (int i = 0; i < PERFORMANCE_COUNT; i++) { + Instant before = Instant.now(); + messageBus.sendMessage(message); + AlarmMessage received = destinationReceiver.waitForMessage(AlarmMessage.class, 100, TimeUnit.SECONDS, + message.getCorrelationID()); + Instant after = Instant.now(); + if (received == null) { + System.err.println("No message received within 100 seconds"); + } - long delay = MILLIS.between(before, after); - delayList.add(delay); + long delay = MILLIS.between(before, after); + delayList.add(delay); + } } addStep("Perform the statistical analysis on the delay results.", "TODO !!!!"); diff --git a/bitrepository-core/src/test/resources/logback-test.xml b/bitrepository-core/src/test/resources/logback-test.xml index 1e02ad24d..28d3a1329 100644 --- a/bitrepository-core/src/test/resources/logback-test.xml +++ b/bitrepository-core/src/test/resources/logback-test.xml @@ -33,4 +33,6 @@ + + \ No newline at end of file diff --git a/bitrepository-core/src/test/resources/settings/xml/bitrepository-devel/ReferenceSettings.xml b/bitrepository-core/src/test/resources/settings/xml/bitrepository-devel/ReferenceSettings.xml index 753f9b7d3..c7074e50f 100644 --- a/bitrepository-core/src/test/resources/settings/xml/bitrepository-devel/ReferenceSettings.xml +++ b/bitrepository-core/src/test/resources/settings/xml/bitrepository-devel/ReferenceSettings.xml @@ -88,8 +88,10 @@ - org.apache.derby.jdbc.EmbeddedDriver - jdbc:derby:target/test/integrityservice/integritydb + org.postgresql.Driver + jdbc:postgresql://localhost:9876/integrityDB + testcontainerUser + testcontainerPassword PT1M diff --git a/bitrepository-core/src/test/resources/testcontainers.properties b/bitrepository-core/src/test/resources/testcontainers.properties new file mode 100644 index 000000000..ed4c13f08 --- /dev/null +++ b/bitrepository-core/src/test/resources/testcontainers.properties @@ -0,0 +1 @@ +checks.disable = true diff --git a/bitrepository-integration/pom.xml b/bitrepository-integration/pom.xml index 867a33e39..ee0f0e5ee 100644 --- a/bitrepository-integration/pom.xml +++ b/bitrepository-integration/pom.xml @@ -87,11 +87,6 @@ io.qameta.allure allure-maven - 2.12.0 - - ${project.basedir}/allure-results - ${project.basedir}/allure-report - maven-assembly-plugin diff --git a/bitrepository-integrity-service/pom.xml b/bitrepository-integrity-service/pom.xml index 99c7f1b28..88284027f 100644 --- a/bitrepository-integrity-service/pom.xml +++ b/bitrepository-integrity-service/pom.xml @@ -29,27 +29,22 @@ org.apache.cxf cxf-rt-transports-http - ${cxf.version} org.apache.cxf cxf-rt-rs-client - ${cxf.version} com.fasterxml.jackson.core jackson-databind - ${jackson.version} - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson.version} + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider jakarta.ws.rs jakarta.ws.rs-api - ${jakarta.ws.rs.version} org.bitrepository.reference @@ -58,15 +53,8 @@ - javax - javaee-web-api - ${javaee.web.version} - provided - - - javax.servlet - javax.servlet-api - ${javax.servlet.version} + jakarta.servlet + jakarta.servlet-api provided @@ -85,28 +73,26 @@ test
- org.apache.activemq + org.apache.artemis artemis-server - ${artemis.version} + test + + + org.testcontainers + testcontainers-junit-jupiter + test + + + org.testcontainers + testcontainers-postgresql test - - - src/test/resources - true - - io.qameta.allure allure-maven - 2.12.0 - - ${project.basedir}/allure-results - ${project.basedir}/allure-report - maven-assembly-plugin @@ -137,52 +123,4 @@ - - - component-test - - - - org.codehaus.mojo - exec-maven-plugin - - - Generate databases - pre-integration-test - - exec - - - bash - - ${project.build.directory}/test-classes/scripts/create_test_databases.sh - - - - - - - org.apache.tomcat.maven - tomcat7-maven-plugin - - - tomcat-run - - run-war-only - - pre-integration-test - - - tomcat-shutdown - - shutdown - - post-integration-test - - - - - - - diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDAO.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDAO.java index 5997112ce..653180d1b 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDAO.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDAO.java @@ -59,7 +59,7 @@ * Common parts of the implementation of the access to the integrity db. * Database specific backends are abstracted out in concrete classes. */ -public abstract class IntegrityDAO { +public abstract class IntegrityDAO implements AutoCloseable { private final Logger log = LoggerFactory.getLogger(getClass()); /** @@ -76,10 +76,15 @@ public IntegrityDAO(DBConnector dbConnector) { /** * Destroys the DB connector. */ + @Override public void close() { dbConnector.destroy(); } + public DBConnector getDbConnector() { + return dbConnector; + } + /** * Method to ensure that pillars found in RepositorySettings are present in the database */ diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDAOUtils.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDAOUtils.java index 5a056fce6..709a6163d 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDAOUtils.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDAOUtils.java @@ -27,7 +27,7 @@ import java.util.List; -public class IntegrityDAOUtils { +public class IntegrityDAOUtils implements AutoCloseable { protected final DBConnector dbConnector; @@ -44,4 +44,8 @@ public List retrieveCollectionsInDatabase() { return DatabaseUtils.selectStringList(dbConnector, selectSql); } + @Override + public void close() { + dbConnector.destroy(); + } } diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDatabaseCreator.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDatabaseCreator.java index 4b0a65402..d254e90ae 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDatabaseCreator.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/cache/database/IntegrityDatabaseCreator.java @@ -48,14 +48,17 @@ public static void main(String[] args) { dbCreator.createIntegrityDatabase(settings, args[1]); } - public void createIntegrityDatabase(Settings settings, String pathToSqlCreationScript) { + public void createIntegrityDatabase(Settings settings, String... pathToSqlCreationScript) { DatabaseSpecifics databaseSpecifics = settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase(); - if (pathToSqlCreationScript == null) { - pathToSqlCreationScript = DEFAULT_INTEGRITY_DB_SCRIPT; + if (pathToSqlCreationScript.length == 0) { + pathToSqlCreationScript = new String[]{DEFAULT_INTEGRITY_DB_SCRIPT}; + } + + for (String script : pathToSqlCreationScript) { + createDatabase(databaseSpecifics, script); } - createDatabase(databaseSpecifics, pathToSqlCreationScript); } } diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/IntegrityServiceRestApplication.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/IntegrityServiceRestApplication.java index 7f5ac1d28..d9307f0e8 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/IntegrityServiceRestApplication.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/IntegrityServiceRestApplication.java @@ -1,8 +1,9 @@ package org.bitrepository.integrityservice.web; -import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; -import javax.ws.rs.core.Application; +import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider; +import jakarta.ws.rs.core.Application; + import java.util.Arrays; import java.util.HashSet; import java.util.Set; diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java index 951416002..67dd0ad29 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java @@ -26,6 +26,18 @@ import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.FormParam; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.StreamingOutput; import org.bitrepository.common.utils.FileSizeUtils; import org.bitrepository.common.utils.SettingsUtils; import org.bitrepository.common.utils.TimeUtils; @@ -47,18 +59,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.FormParam; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.StreamingOutput; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -80,9 +80,6 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import static javax.ws.rs.core.Response.ResponseBuilder; -import static javax.ws.rs.core.Response.Status; -import static javax.ws.rs.core.Response.status; @Path("/IntegrityService") public class RestIntegrityService { @@ -117,15 +114,22 @@ public HashMap> getTotalFileIDs(@QueryParam("collectionID") if (it == null) { throw new WebApplicationException( - status(Status.NO_CONTENT).entity("Failed to get missing files from database").type( - MediaType.TEXT_PLAIN).build()); + Response.status(Response.Status.NO_CONTENT) + .entity("Failed to get missing files from database") + .type(MediaType.TEXT_PLAIN) + .build()); } List iteratorAsList = StreamingTools.iteratorToList(it); if (iteratorAsList.isEmpty()) { - throw new WebApplicationException(status(Status.NOT_FOUND).entity( - String.format(Locale.ROOT, "No fileIDs found for collection: '%s' and pillar: '%s'", collectionID, - pillarID)).type(MediaType.TEXT_PLAIN).build()); + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity(String.format(Locale.ROOT, + "No fileIDs found for collection: '%s' and pillar: '%s'", + collectionID, + pillarID)) + .type(MediaType.TEXT_PLAIN) + .build()); } return new HashMap<>(Map.of(pillarID, iteratorAsList)); @@ -156,9 +160,15 @@ public HashMap> getMissingFileIDs(@QueryParam("collectionID missingOnPillar = getReportPart(part, collectionID, pillarID, page, pageSize); output.put(pillarID, missingOnPillar); } catch (FileNotFoundException e) { - throw new WebApplicationException(status(Status.NOT_FOUND).entity(String.format(Locale.ROOT, - "No integrity '%s' report part for collection: '%s' and pillar: '%s' found!", part.getHumanString(), - collectionID, pillarID)).type(MediaType.TEXT_PLAIN).build()); + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity(String.format(Locale.ROOT, + "No integrity '%s' report part for collection: '%s' and pillar: '%s' found!", + part.getHumanString(), + collectionID, + pillarID)) + .type(MediaType.TEXT_PLAIN) + .build()); } for (String otherPillar : otherPillars) { @@ -360,9 +370,13 @@ public StreamingOutput getLatestIntegrityReport(@QueryParam("collectionID") Stri try { fullReport = integrityReportProvider.getLatestIntegrityReportReader(collectionID).getFullReport(); } catch (FileNotFoundException e) { - throw new WebApplicationException(status(Status.NOT_FOUND).entity( - String.format(Locale.ROOT, "No integrity report for collection: '%s' found!", collectionID)).type( - MediaType.TEXT_PLAIN).build()); + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity(String.format(Locale.ROOT, + "No integrity report for collection: '%s' found!", + collectionID)) + .type(MediaType.TEXT_PLAIN) + .build()); } return output -> streamFile(fullReport, output); } @@ -395,15 +409,15 @@ public Response getIntegrityReportsAsZIP(@QueryParam("collectionID") String coll zipOut.flush(); } catch (IOException e) { throw new WebApplicationException( - status(Status.INTERNAL_SERVER_ERROR) - .entity("Internal error when trying to zip the report file " + key + ": " + e) - .type(MediaType.TEXT_PLAIN) - .build()); + Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("Internal error when trying to zip the report file " + key + ": " + e) + .type(MediaType.TEXT_PLAIN) + .build()); } }); } }; - ResponseBuilder response = Response.ok(); + Response.ResponseBuilder response = Response.ok(); response.type("application/zip"); response.header("Content-Disposition", "attachment; filename=" + fileName); response.entity(streamingOutput); @@ -429,7 +443,7 @@ public File getLatestIntegrityReportPartFile(String collectionID, String reportP pillarID); log.error(errorMessage); throw new WebApplicationException( - status(Status.NOT_FOUND).entity(errorMessage).type(MediaType.TEXT_PLAIN).build()); + Response.status(Response.Status.NOT_FOUND).entity(errorMessage).type(MediaType.TEXT_PLAIN).build()); } return reportPartFile; } @@ -513,9 +527,15 @@ private List getReportPartForPillar(ReportPart part, String collectionID try { reportPartContent = getReportPart(part, collectionID, pillarID, page, pageSize); } catch (FileNotFoundException e) { - throw new WebApplicationException(status(Status.NOT_FOUND).entity(String.format(Locale.ROOT, - "No integrity '%s' report part for collection: '%s' and pillar: '%s' found!", part.getHumanString(), - collectionID, pillarID)).type(MediaType.TEXT_PLAIN).build()); + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity(String.format(Locale.ROOT, + "No integrity '%s' report part for collection: '%s' and pillar: '%s' found!", + part.getHumanString(), + collectionID, + pillarID)) + .type(MediaType.TEXT_PLAIN) + .build()); } return reportPartContent; } diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestStatisticsService.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestStatisticsService.java index 84751dd3c..611f371e6 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestStatisticsService.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestStatisticsService.java @@ -21,6 +21,12 @@ */ package org.bitrepository.integrityservice.web; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; import org.bitrepository.common.utils.FileSizeUtils; import org.bitrepository.common.utils.SettingsUtils; import org.bitrepository.common.utils.TimeUtils; @@ -32,12 +38,6 @@ import org.bitrepository.integrityservice.cache.IntegrityModel; import org.bitrepository.integrityservice.cache.PillarCollectionStat; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/StreamingTools.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/StreamingTools.java index e3cf4eeab..27c57a8db 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/StreamingTools.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/StreamingTools.java @@ -24,12 +24,12 @@ import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.StreamingOutput; import org.bitrepository.integrityservice.cache.database.IntegrityIssueIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.StreamingOutput; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/CreateStatisticsEntryStep.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/CreateStatisticsEntryStep.java index 26f35e617..18f62530c 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/CreateStatisticsEntryStep.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/CreateStatisticsEntryStep.java @@ -70,7 +70,7 @@ public synchronized void performStep() { } sc.getCollectionStat().setFileCount(store.getNumberOfFilesInCollection(collectionID)); sc.getCollectionStat().setDataSize(store.getCollectionFileSize(collectionID)); - sc.getCollectionStat().setLatestFileTime(store.getDateForNewestFileEntryForCollection(collectionID)); + sc.getCollectionStat().setLatestFileTime(store.getDateForNewestFileEntryForCollectionInstant(collectionID)); store.createStatistics(collectionID, sc); } diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/HandleMissingFilesStep.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/HandleMissingFilesStep.java index 0a27513d4..5f4399680 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/HandleMissingFilesStep.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/HandleMissingFilesStep.java @@ -88,8 +88,8 @@ public synchronized void performStep() throws StepFailedException { String missingFile; while ((missingFile = issueIterator.getNextIntegrityIssue()) != null) { - Date earliestDate = store.getEarliestFileDate(reporter.getCollectionID(), missingFile); - if (earliestDate.before(missingAfterDate)) { + Instant earliestDate = store.getEarliestFileInstant(reporter.getCollectionID(), missingFile); + if (earliestDate.isBefore(missingAfterInstant)) { try { Set pillarsWithFile = getPillarsWithFile(missingFile, reporter.getCollectionID()); for (String pillar : pillars) { diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/HandleObsoleteChecksumsStep.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/HandleObsoleteChecksumsStep.java index bd9aae5ba..6c7abb37f 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/HandleObsoleteChecksumsStep.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/HandleObsoleteChecksumsStep.java @@ -85,7 +85,7 @@ public synchronized void performStep() throws StepFailedException { " (i.e., checksums don't expire).", pillar); continue; } else { - Date outdated = Date.from(Instant.now().minus(maxAge)); + Instant outdated = Instant.now().minus(maxAge); try (IntegrityIssueIterator obsoleteChecksumsIterator = store.findChecksumsOlderThan(outdated, pillar, reporter.getCollectionID())) { String file; diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/UpdateChecksumsStep.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/UpdateChecksumsStep.java index 9f3adee3d..11d5e01f5 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/UpdateChecksumsStep.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/UpdateChecksumsStep.java @@ -39,6 +39,7 @@ import org.slf4j.LoggerFactory; import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -155,7 +156,7 @@ private void handleFailureEvent(OperationEvent event) throws WorkflowAbortedExce private ContributorQuery[] getQueries(Collection pillars) { List res = new ArrayList<>(); for (String pillar : pillars) { - Date latestChecksumEntry = store.getDateForNewestChecksumEntryForPillar(pillar, collectionID); + Instant latestChecksumEntry = store.getDateForNewestChecksumEntryForPillarInstant(pillar, collectionID); res.add(new ContributorQuery(pillar, latestChecksumEntry, null, maxNumberOfResultsPerConversation)); } diff --git a/bitrepository-integrity-service/src/main/resources/sql/postgres/integrityDB7to8migration.sql b/bitrepository-integrity-service/src/main/resources/sql/postgres/integrityDB7to8migration.sql index ad5140807..551637c58 100644 --- a/bitrepository-integrity-service/src/main/resources/sql/postgres/integrityDB7to8migration.sql +++ b/bitrepository-integrity-service/src/main/resources/sql/postgres/integrityDB7to8migration.sql @@ -26,4 +26,4 @@ UPDATE tableversions SET version = 8 WHERE tablename = 'integritydb'; -- table version UPDATE tableversions SET version = 3 WHERE tablename = 'pillarstats'; -ALTER TABLE pillarstats ADD COLUMN oldest_checksum_timestamp BIGINT DEFAULT NULL; +ALTER TABLE pillarstats ADD COLUMN IF NOT EXISTS oldest_checksum_timestamp BIGINT DEFAULT NULL ; diff --git a/bitrepository-integrity-service/src/main/resources/sql/postgres/integrityDBCreation.sql b/bitrepository-integrity-service/src/main/resources/sql/postgres/integrityDBCreation.sql index 1a7c3b26e..0a25ad94c 100644 --- a/bitrepository-integrity-service/src/main/resources/sql/postgres/integrityDBCreation.sql +++ b/bitrepository-integrity-service/src/main/resources/sql/postgres/integrityDBCreation.sql @@ -30,20 +30,20 @@ -- of the tables, especially when upgrading. -- Expected entry count: only those in this script. --**************************************************************************-- -CREATE TABLE tableversions ( +CREATE TABLE IF NOT EXISTS tableversions ( tablename VARCHAR(100) NOT NULL, -- Name of table version SMALLINT NOT NULL -- version of table ); -INSERT INTO tableversions (tablename, version) VALUES ('fileinfo', 6); -INSERT INTO tableversions (tablename, version) VALUES ('files', 2); -INSERT INTO tableversions (tablename, version) VALUES ('pillar', 3); -INSERT INTO tableversions (tablename, version) VALUES ('collections' ,2); -INSERT INTO tableversions (tablename, version) VALUES ('integritydb', 7); -INSERT INTO tableversions (tablename, version) VALUES ('stats', 3); -INSERT INTO tableversions (tablename, version) VALUES ('collectionstats', 3); -INSERT INTO tableversions (tablename, version) VALUES ('pillarstats', 2); -INSERT INTO tableversions (tablename, version) VALUES ('collection_progress', 2); +INSERT INTO tableversions (tablename, version) VALUES ('fileinfo', 6) ON CONFLICT DO NOTHING; +INSERT INTO tableversions (tablename, version) VALUES ('files', 2) ON CONFLICT DO NOTHING; +INSERT INTO tableversions (tablename, version) VALUES ('pillar', 3) ON CONFLICT DO NOTHING; +INSERT INTO tableversions (tablename, version) VALUES ('collections' ,2) ON CONFLICT DO NOTHING; +INSERT INTO tableversions (tablename, version) VALUES ('integritydb', 7) ON CONFLICT DO NOTHING; +INSERT INTO tableversions (tablename, version) VALUES ('stats', 3) ON CONFLICT DO NOTHING; +INSERT INTO tableversions (tablename, version) VALUES ('collectionstats', 3) ON CONFLICT DO NOTHING; +INSERT INTO tableversions (tablename, version) VALUES ('pillarstats', 2) ON CONFLICT DO NOTHING; +INSERT INTO tableversions (tablename, version) VALUES ('collection_progress', 2) ON CONFLICT DO NOTHING; --*************************************************************************-- -- Name: collections @@ -51,7 +51,7 @@ INSERT INTO tableversions (tablename, version) VALUES ('collection_progress', 2) -- Purpose: Keeps track of the names of the files within the system. -- Expected entry count: Few --*************************************************************************-- -CREATE TABLE collections ( +CREATE TABLE IF NOT EXISTS collections ( collectionID VARCHAR(255) PRIMARY KEY -- The id for the collection. ); @@ -62,7 +62,7 @@ CREATE TABLE collections ( -- Purpose: Keeps track of the information about the pillars. -- Expected entry count: Few --*************************************************************************-- -CREATE TABLE pillar ( +CREATE TABLE IF NOT EXISTS pillar ( pillarID VARCHAR(100) PRIMARY KEY -- The id of the pillar. ); @@ -74,7 +74,7 @@ CREATE TABLE pillar ( -- on a specific pillar. -- Expected entry count: Very, very many. --*************************************************************************-- -CREATE TABLE fileinfo ( +CREATE TABLE IF NOT EXISTS fileinfo ( fileID VARCHAR(255) NOT NULL, -- The file ID collectionID VARCHAR(255) NOT NULL, -- The collection ID pillarID VARCHAR(100) NOT NULL, -- The pillar ID @@ -90,7 +90,7 @@ CREATE TABLE fileinfo ( FOREIGN KEY (pillarID) REFERENCES pillar(pillarID) ); -CREATE INDEX collectionfileidx ON fileinfo(collectionid, fileid); +CREATE INDEX IF NOT EXISTS collectionfileidx ON fileinfo(collectionid, fileid); --*************************************************************************-- -- Name: collection_progress @@ -99,7 +99,7 @@ CREATE INDEX collectionfileidx ON fileinfo(collectionid, fileid); -- a given pillar in a given collection -- Expected entry count: few --*************************************************************************-- -CREATE TABLE collection_progress ( +CREATE TABLE IF NOT EXISTS collection_progress ( collectionID VARCHAR(255) NOT NULL, pillarID VARCHAR(100) NOT NULL, latest_file_timestamp BIGINT DEFAULT NULL, @@ -115,7 +115,7 @@ CREATE TABLE collection_progress ( -- Purpose: Keeps track of the collected statistics. -- Expected entry count: Many (over time) --*************************************************************************-- -CREATE TABLE stats ( +CREATE TABLE IF NOT EXISTS stats ( stat_key SERIAL PRIMARY KEY, -- The key for a set of statistics. stat_time BIGINT NOT NULL, -- The time (millis since epoch) the statistics entry were made. @@ -126,7 +126,7 @@ CREATE TABLE stats ( -- Foreign key constraint on collectionID, enforcing the presence of the referred key ); -CREATE INDEX lastupdatetimeindex ON stats (last_update); +CREATE INDEX IF NOT EXISTS lastupdatetimeindex ON stats (last_update); --*************************************************************************-- -- Name: collectionstats @@ -134,7 +134,7 @@ CREATE INDEX lastupdatetimeindex ON stats (last_update); -- Purpose: Keeps track of the statistics for a collection. -- Expected entry count: many (over time) --*************************************************************************-- -CREATE TABLE collectionstats ( +CREATE TABLE IF NOT EXISTS collectionstats ( collectionstat_key SERIAL PRIMARY KEY, -- The key for the collectionstat. stat_key INT NOT NULL, -- The key for the statistics entity. @@ -153,7 +153,7 @@ CREATE TABLE collectionstats ( -- Purpose: Keeps track of the statistics for a pillar. -- Expected entry count: many (over time) --*************************************************************************-- -CREATE TABLE pillarstats ( +CREATE TABLE IF NOT EXISTS pillarstats ( pillarstat_key SERIAL PRIMARY KEY, -- The key for the pillarstat. stat_key INT NOT NULL, -- The key for the statistics entity. diff --git a/bitrepository-integrity-service/src/main/scripts/create_derby_databases.sh b/bitrepository-integrity-service/src/main/scripts/create_derby_databases.sh index 147127bd0..897ce24b5 100755 --- a/bitrepository-integrity-service/src/main/scripts/create_derby_databases.sh +++ b/bitrepository-integrity-service/src/main/scripts/create_derby_databases.sh @@ -1,4 +1,12 @@ -#!/bin/bash +#!/usr/bin/env bash + +SCRIPT_DIR="$(dirname "$(readlink -f -- "${BASH_SOURCE[0]}")")" + +set -o errexit +set -o pipefail +set -o nounset +#set -o xtrace + ### # #%L @@ -34,9 +42,9 @@ echo "Unzipping war to get access to lib files." unzip -o -qq *.war echo "Creating integrity database." -$JAVA $CLASSPATH org.bitrepository.integrityservice.cache.database.IntegrityDatabaseCreator $CONFDIR $INTEGRITY_DB_SCRIPT +$JAVA $CLASSPATH "org.bitrepository.integrityservice.cache.database.IntegrityDatabaseCreator" "$CONFDIR" "$INTEGRITY_DB_SCRIPT" echo "Creating audit database." -$JAVA $CLASSPATH org.bitrepository.integrityservice.audittrail.IntegrityAuditTrailDatabaseCreator $CONFDIR $AUDIT_CONTRIBUTOR_DB_SCRIPT +$JAVA $CLASSPATH "org.bitrepository.integrityservice.audittrail.IntegrityAuditTrailDatabaseCreator" "$CONFDIR" "$AUDIT_CONTRIBUTOR_DB_SCRIPT" -cp -r target $FINAL_DIR +cp -r target "$FINAL_DIR" rm -r target \ No newline at end of file diff --git a/bitrepository-integrity-service/src/main/webapp/WEB-INF/web.xml b/bitrepository-integrity-service/src/main/webapp/WEB-INF/web.xml index 4a1a630bf..1a8b7e0f3 100644 --- a/bitrepository-integrity-service/src/main/webapp/WEB-INF/web.xml +++ b/bitrepository-integrity-service/src/main/webapp/WEB-INF/web.xml @@ -30,7 +30,7 @@ Bitrepository-integrityservice org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet - javax.ws.rs.Application + jakarta.ws.rs.Application org.bitrepository.integrityservice.web.IntegrityServiceRestApplication 1 diff --git a/bitrepository-integrity-service/src/test/conf/ReferenceSettings.xml b/bitrepository-integrity-service/src/test/conf/ReferenceSettings.xml index 5118c31c2..d283b01b7 100644 --- a/bitrepository-integrity-service/src/test/conf/ReferenceSettings.xml +++ b/bitrepository-integrity-service/src/test/conf/ReferenceSettings.xml @@ -35,12 +35,12 @@ integrity-service org.apache.derby.jdbc.EmbeddedDriver - jdbc:derby:target/database/integritydb + jdbc:derby:target/database/integritydb;create=true PT1H org.apache.derby.jdbc.EmbeddedDriver - jdbc:derby:target/database/auditcontributerdb + jdbc:derby:target/database/auditcontributerdb;create=true P30D diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/IntegrityAlerterTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/IntegrityAlerterIT.java similarity index 98% rename from bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/IntegrityAlerterTest.java rename to bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/IntegrityAlerterIT.java index 526a23753..a5f49fa52 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/IntegrityAlerterTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/IntegrityAlerterIT.java @@ -36,7 +36,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -public class IntegrityAlerterTest extends IntegrationTest { +public class IntegrityAlerterIT extends IntegrationTest { @Test @Tag("regressiontest") @Tag("integritytest") diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/IntegrityDatabaseTestCase.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/IntegrityDatabaseTestCase.java index 3df0a3288..5ef76ba4c 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/IntegrityDatabaseTestCase.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/IntegrityDatabaseTestCase.java @@ -5,16 +5,16 @@ * Copyright (C) 2010 - 2012 The State and University Library, The Royal Library and The State Archives, Denmark * %% * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public + * + * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * . * #L% @@ -28,35 +28,67 @@ import org.bitrepository.common.settings.Settings; import org.bitrepository.common.settings.TestSettingsProvider; import org.bitrepository.common.utils.SettingsUtils; +import org.bitrepository.integrityservice.cache.IntegrityDatabaseManager; import org.bitrepository.integrityservice.cache.IntegrityModel; +import org.bitrepository.integrityservice.cache.database.DerbyIntegrityDAO; +import org.bitrepository.integrityservice.cache.database.IntegrityDAO; import org.bitrepository.integrityservice.cache.database.IntegrityDatabaseCreator; +import org.bitrepository.integrityservice.cache.database.PostgresIntegrityDAO; +import org.bitrepository.pillar.integration.PostgresFixedPortContainer; import org.bitrepository.service.database.DBConnector; +import org.bitrepository.service.database.DatabaseManager; import org.bitrepository.service.database.DatabaseUtils; -import org.bitrepository.service.database.DerbyDatabaseDestroyer; -import org.junit.jupiter.api.AfterEach; +import org.bitrepository.settings.referencesettings.DatabaseSpecifics; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestInstance; +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.InternetProtocol; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import javax.xml.datatype.DatatypeConfigurationException; import java.math.BigInteger; import java.util.List; +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@Testcontainers public abstract class IntegrityDatabaseTestCase { protected Settings settings; - - @BeforeEach - public void setup() throws Exception { + + @Container + static PostgreSQLContainer integrityDB = new PostgresFixedPortContainer("postgres:18-alpine") + .withFixedExposedPort(9876, 5432, InternetProtocol.TCP) + .withDatabaseName("integrityDB") + .withUsername("testcontainerUser") + .withPassword("testcontainerPassword") + .withLabel("purpose", "integrityDB") + .withClasspathResourceMapping( + "sql/postgres/integrityDBCreation.sql", + "/docker-entrypoint-initdb.d/init.sql", + BindMode.READ_ONLY) + .withClasspathResourceMapping( + "sql/postgres/integrityDB7to8migration.sql", + "/docker-entrypoint-initdb.d/init2.sql", + BindMode.READ_ONLY); + + @BeforeAll + public void beforeAll() throws DatatypeConfigurationException { settings = TestSettingsProvider.reloadSettings("IntegrityCheckingUnderTest"); customizeSettings(); SettingsUtils.initialize(settings); - DerbyDatabaseDestroyer.deleteDatabase( - settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); + } - IntegrityDatabaseCreator integrityDatabaseCreator = new IntegrityDatabaseCreator(); - integrityDatabaseCreator.createIntegrityDatabase(settings, null); + @BeforeEach + public void beforeEach() { + clearDatabase(); + new IntegrityDatabaseCreator().createIntegrityDatabase(settings, + "sql/postgres/integrityDBCreation.sql", + "sql/postgres/integrityDB7to8migration.sql"); } - - @AfterEach - public void clearDatabase() throws Exception { + + public void clearDatabase() { DBConnector connector = new DBConnector(settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); DatabaseUtils.executeStatement(connector, "DELETE FROM fileinfo"); DatabaseUtils.executeStatement(connector, "DELETE FROM collection_progress"); @@ -66,44 +98,56 @@ public void clearDatabase() throws Exception { DatabaseUtils.executeStatement(connector, "DELETE FROM pillar"); DatabaseUtils.executeStatement(connector, "DELETE FROM collections"); } - + /** - * Inserts the checksumdata, but ensures that the data can be inserted, by inserting the file-id-data before. + * Inserts the checksumdata, but ensures that the data can be inserted, by inserting the file-id-data before. * @param cache The integrity cache. * @param csData The checksum data. * @param pillarID The id of the pillar. * @param collectionID The id of the collection. */ - protected void insertChecksumDataForModel(IntegrityModel cache, List csData, + protected void insertChecksumDataForModel(IntegrityModel cache, List csData, String pillarID, String collectionID) { insertMissingFilesInChecksumDataForModel(cache, csData, pillarID, collectionID); cache.addChecksums(csData, pillarID, collectionID); } - + /** * Converts a piece of checksum data into file id data. * @param csData The checksum data to convert. */ - protected void insertMissingFilesInChecksumDataForModel(IntegrityModel cache, List csData, + protected void insertMissingFilesInChecksumDataForModel(IntegrityModel cache, List csData, String pillarID, String collectionID) { FileIDsData res = new FileIDsData(); FileIDsDataItems items = new FileIDsDataItems(); - + for(ChecksumDataForChecksumSpecTYPE entry : csData) { FileIDsDataItem dataItem = new FileIDsDataItem(); dataItem.setFileID(entry.getFileID()); dataItem.setFileSize(BigInteger.ZERO); dataItem.setLastModificationTime(entry.getCalculationTimestamp()); items.getFileIDsDataItem().add(dataItem); - } - + } + res.setFileIDsDataItems(items); cache.addFileIDs(res, pillarID, collectionID); } - + /** - * Method to modify the by constructor loaded settings. - * Default implementation does nothing, so override to change behavior. + * Method to modify the by constructor loaded settings. + * Default implementation does nothing, so override to change behavior. */ protected void customizeSettings() throws DatatypeConfigurationException { } + + protected IntegrityDAO createDAO() { + DatabaseSpecifics integrityDatabase = settings.getReferenceSettings() + .getIntegrityServiceSettings() + .getIntegrityDatabase(); + DatabaseManager dm = new IntegrityDatabaseManager(integrityDatabase); + + return switch (integrityDatabase.getDriverClass()) { + case "org.postgresql.Driver" -> new PostgresIntegrityDAO(dm.getConnector()); + default -> new DerbyIntegrityDAO(dm.getConnector()); + }; + } } diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDAOTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDAOTest.java index 9efe5283f..772e93ae7 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDAOTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDAOTest.java @@ -32,7 +32,6 @@ import org.bitrepository.common.utils.Base16Utils; import org.bitrepository.common.utils.CalendarUtils; import org.bitrepository.integrityservice.IntegrityDatabaseTestCase; -import org.bitrepository.integrityservice.cache.database.DerbyIntegrityDAO; import org.bitrepository.integrityservice.cache.database.IntegrityDAO; import org.bitrepository.integrityservice.cache.database.IntegrityIssueIterator; import org.bitrepository.service.database.DatabaseManager; @@ -40,6 +39,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.math.BigInteger; import java.time.Instant; @@ -57,6 +58,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; class IntegrityDAOTest extends IntegrityDatabaseTestCase { + private static final Logger log = LoggerFactory.getLogger(IntegrityDAOTest.class); String TEST_PILLAR_1 = "MY-TEST-PILLAR-1"; String TEST_PILLAR_2 = "MY-TEST-PILLAR-2"; String EXTRA_PILLAR = "MY-EXTRA-PILLAR"; @@ -68,9 +70,7 @@ class IntegrityDAOTest extends IntegrityDatabaseTestCase { static final String EXTRA_COLLECTION = "extra-collection"; @BeforeEach - @Override - public void setup() throws Exception { - super.setup(); + public void setup() { TEST_COLLECTIONID = settings.getRepositorySettings().getCollections().getCollection().get(0).getID(); } @@ -99,10 +99,11 @@ protected void customizeSettings() { @Tag("regressiontest") @Tag("databasetest") @Tag("integritytest") - void instantiationTest() throws Exception { + void instantiationTest() { addDescription("Testing the connection to the integrity database."); - IntegrityDAO cache = createDAO(); - Assertions.assertNotNull(cache); + try (IntegrityDAO cache = createDAO()) { + Assertions.assertNotNull(cache); + } } @Test @@ -115,40 +116,46 @@ void reinitialiseDatabaseTest() throws Exception { DatabaseManager dm = new IntegrityDatabaseManager( settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - IntegrityDAO cache = new DerbyIntegrityDAO(dm.getConnector()); - Assertions.assertNotNull(cache); + try (IntegrityDAO cache = createDAO()) { + Assertions.assertNotNull(cache); - addStep("Close the connection and create another one.", "Should not fail"); - dm.getConnector().getConnection().close(); - dm.getConnector().destroy(); + addStep("Close the connection and create another one.", "Should not fail"); + cache.close(); + dm.getConnector().getConnection().close(); + dm.getConnector().destroy(); - synchronized (this) { - wait(100); - } + synchronized (this) { + wait(100); + } - DatabaseManager newdm = new IntegrityDatabaseManager( - settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); + DatabaseManager newdm = new IntegrityDatabaseManager( + settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - cache = new DerbyIntegrityDAO(newdm.getConnector()); + try (IntegrityDAO ignored = createDAO()) { + //There must be some code in this block, otherwise it is not run... + log.debug("Dao created"); + } + } } @Test @Tag("regressiontest") @Tag("databasetest") @Tag("integritytest") - void initialStateExtractionTest() throws Exception { + void initialStateExtractionTest() { addDescription("Tests the initial state of the IntegrityModel. Should not contain any data."); - IntegrityDAO cache = createDAO(); + try (IntegrityDAO cache = createDAO()) { - List pillersInDB = cache.getAllPillars(); - Assertions.assertTrue(pillersInDB.containsAll(Arrays.asList(TEST_PILLAR_1, TEST_PILLAR_2, EXTRA_PILLAR))); - Assertions.assertEquals(3, pillersInDB.size()); - List collectionsInDB = cache.getCollections(); - Assertions.assertTrue(collectionsInDB.containsAll(Arrays.asList(TEST_COLLECTIONID, EXTRA_COLLECTION))); - Assertions.assertEquals(2, collectionsInDB.size()); + List pillersInDB = cache.getAllPillars(); + Assertions.assertTrue(pillersInDB.containsAll(Arrays.asList(TEST_PILLAR_1, TEST_PILLAR_2, EXTRA_PILLAR))); + Assertions.assertEquals(3, pillersInDB.size()); + List collectionsInDB = cache.getCollections(); + Assertions.assertTrue(collectionsInDB.containsAll(Arrays.asList(TEST_COLLECTIONID, EXTRA_COLLECTION))); + Assertions.assertEquals(2, collectionsInDB.size()); - Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); - Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); + Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); + Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); + } } @Test @@ -157,108 +164,122 @@ void initialStateExtractionTest() throws Exception { @Tag("integritytest") void testCorrectDateHandling() { addDescription("Testing the correct ingest and extraction of file and checksum dates"); - IntegrityDAO cache = createDAO(); - - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ROOT); - Instant summertimeTS = ZonedDateTime.parse("2015-10-25T02:59:54.000+02:00", formatter).toInstant(); - Instant summertimeUnix = Instant.ofEpochMilli(1445734794000L); - Assertions.assertEquals(summertimeUnix, summertimeTS); - - Instant wintertimeTS = ZonedDateTime.parse("2015-10-25T02:59:54.000+01:00", formatter).toInstant(); - Instant wintertimeUnix = Instant.ofEpochMilli(1445738394000L); - Assertions.assertEquals(wintertimeUnix, wintertimeTS); - - FileIDsData summertimeData = getFileIDsData("summertime"); - summertimeData.getFileIDsDataItems().getFileIDsDataItem().get(0) - .setLastModificationTime(CalendarUtils.getXmlGregorianCalendar(summertimeTS)); - FileIDsData wintertimeData = getFileIDsData("wintertime"); - wintertimeData.getFileIDsDataItems().getFileIDsDataItem().get(0) - .setLastModificationTime(CalendarUtils.getXmlGregorianCalendar(wintertimeTS)); - cache.updateFileIDs(summertimeData, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(wintertimeData, TEST_PILLAR_1, TEST_COLLECTIONID); - - List summertimeCsData = getChecksumResults("summertime", TEST_CHECKSUM); - summertimeCsData.get(0).setCalculationTimestamp(CalendarUtils.getXmlGregorianCalendar(summertimeTS)); - List wintertimeCsData = getChecksumResults("wintertime", TEST_CHECKSUM); - wintertimeCsData.get(0).setCalculationTimestamp(CalendarUtils.getXmlGregorianCalendar(wintertimeTS)); - cache.updateChecksums(summertimeCsData, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateChecksums(wintertimeCsData, TEST_PILLAR_1, TEST_COLLECTIONID); - - List fis = cache.getFileInfosForFile("summertime", TEST_COLLECTIONID); - Assertions.assertEquals(1, fis.size(), fis.toString()); - Assertions.assertEquals(summertimeUnix, fis.get(0).getDateForLastChecksumCheckInstant()); - - fis = cache.getFileInfosForFile("wintertime", TEST_COLLECTIONID); - Assertions.assertEquals(1, fis.size(), fis.toString()); - Assertions.assertEquals(wintertimeUnix, fis.get(0).getDateForLastChecksumCheckInstant()); + try (IntegrityDAO cache = createDAO()) { + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ROOT); + Instant summertimeTS = ZonedDateTime.parse("2015-10-25T02:59:54.000+02:00", formatter).toInstant(); + Instant summertimeUnix = Instant.ofEpochMilli(1445734794000L); + Assertions.assertEquals(summertimeUnix, summertimeTS); + + Instant wintertimeTS = ZonedDateTime.parse("2015-10-25T02:59:54.000+01:00", formatter).toInstant(); + Instant wintertimeUnix = Instant.ofEpochMilli(1445738394000L); + Assertions.assertEquals(wintertimeUnix, wintertimeTS); + + FileIDsData summertimeData = getFileIDsData("summertime"); + summertimeData.getFileIDsDataItems().getFileIDsDataItem().get(0) + .setLastModificationTime(CalendarUtils.getXmlGregorianCalendar(summertimeTS)); + FileIDsData wintertimeData = getFileIDsData("wintertime"); + wintertimeData.getFileIDsDataItems().getFileIDsDataItem().get(0) + .setLastModificationTime(CalendarUtils.getXmlGregorianCalendar(wintertimeTS)); + cache.updateFileIDs(summertimeData, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(wintertimeData, TEST_PILLAR_1, TEST_COLLECTIONID); + + List summertimeCsData = getChecksumResults("summertime", TEST_CHECKSUM); + summertimeCsData.get(0).setCalculationTimestamp(CalendarUtils.getXmlGregorianCalendar(summertimeTS)); + List wintertimeCsData = getChecksumResults("wintertime", TEST_CHECKSUM); + wintertimeCsData.get(0).setCalculationTimestamp(CalendarUtils.getXmlGregorianCalendar(wintertimeTS)); + cache.updateChecksums(summertimeCsData, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateChecksums(wintertimeCsData, TEST_PILLAR_1, TEST_COLLECTIONID); + + List fis = cache.getFileInfosForFile("summertime", TEST_COLLECTIONID); + Assertions.assertEquals(1, fis.size(), fis.toString()); + Assertions.assertEquals(summertimeUnix, fis.get(0).getDateForLastChecksumCheckInstant()); + + fis = cache.getFileInfosForFile("wintertime", TEST_COLLECTIONID); + Assertions.assertEquals(1, fis.size(), fis.toString()); + Assertions.assertEquals(wintertimeUnix, fis.get(0).getDateForLastChecksumCheckInstant()); + } } @Test @Tag("regressiontest") @Tag("databasetest") @Tag("integritytest") - void testIngestOfFileIDsData() throws Exception { + void testIngestOfFileIDsData() { addDescription("Tests the ingesting of file ids data"); - IntegrityDAO cache = createDAO(); - - Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); - Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); - - addStep("Create data", "Should be ingested into the database"); - FileIDsData data1 = getFileIDsData(TEST_FILE_ID); - cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); - - addStep("Extract the data", "Should be identical to the ingested data"); - Collection fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); - Assertions.assertNotNull(fileinfos); - for (FileInfo fi : fileinfos) { - Assertions.assertEquals(TEST_FILE_ID, fi.getFileId()); - Assertions.assertNull(fi.getChecksum()); - Assertions.assertEquals(Instant.EPOCH, fi.getDateForLastChecksumCheckInstant()); - Assertions.assertEquals(CalendarUtils.convertFromXMLGregorianCalendarToInstant( - data1.getFileIDsDataItems().getFileIDsDataItem().get(0).getLastModificationTime()), + try (IntegrityDAO cache = createDAO()) { + + Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); + Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); + + addStep("Create data", "Should be ingested into the database"); + FileIDsData data1 = getFileIDsData(TEST_FILE_ID); + cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); + + addStep("Extract the data", "Should be identical to the ingested data"); + Collection fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); + Assertions.assertNotNull(fileinfos); + for (FileInfo fi : fileinfos) { + Assertions.assertEquals(TEST_FILE_ID, fi.getFileId()); + Assertions.assertNull(fi.getChecksum()); + Assertions.assertEquals(Instant.EPOCH, fi.getDateForLastChecksumCheckInstant()); + Assertions.assertEquals( + CalendarUtils.convertFromXMLGregorianCalendarToInstant( + data1.getFileIDsDataItems() + .getFileIDsDataItem() + .getFirst() + .getLastModificationTime()), fi.getDateForLastFileIDCheckInstant()); - Assertions.assertEquals(Long.valueOf(data1.getFileIDsDataItems().getFileIDsDataItem().get(0).getFileSize().longValue()), + Assertions.assertEquals( + Long.valueOf( + data1.getFileIDsDataItems() + .getFileIDsDataItem() + .getFirst() + .getFileSize() + .longValue()), fi.getFileSize()); - } + } - addStep("Check that the extra collection is untouched by the ingest", "should deliver an empty collection and" + - " no errors"); - Assertions.assertEquals(Long.valueOf(1), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); - Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); + addStep("Check that the extra collection is untouched by the ingest", + "should deliver an empty collection and no errors"); + Assertions.assertEquals(Long.valueOf(1), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); + Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); + } } @Test @Tag("regressiontest") @Tag("databasetest") @Tag("integritytest") - void testIngestOfChecksumsData() throws Exception { + void testIngestOfChecksumsData() { addDescription("Tests the ingesting of checksums data"); - IntegrityDAO cache = createDAO(); - - Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); - Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); - - addStep("Create data", "Should be ingested into the database"); - List csData = getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM); - cache.updateChecksums(csData, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateChecksums(csData, TEST_PILLAR_2, TEST_COLLECTIONID); - - addStep("Extract the data", "Should be identical to the ingested data"); - Collection fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); - Assertions.assertNotNull(fileinfos); - for (FileInfo fi : fileinfos) { - Assertions.assertEquals(TEST_FILE_ID, fi.getFileId()); - Assertions.assertEquals(TEST_CHECKSUM, fi.getChecksum()); - Assertions.assertEquals(CalendarUtils.convertFromXMLGregorianCalendarToInstant(csData.get(0).getCalculationTimestamp()), + try (IntegrityDAO cache = createDAO()) { + + Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); + Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); + + addStep("Create data", "Should be ingested into the database"); + List csData = getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM); + cache.updateChecksums(csData, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateChecksums(csData, TEST_PILLAR_2, TEST_COLLECTIONID); + + addStep("Extract the data", "Should be identical to the ingested data"); + Collection fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); + Assertions.assertNotNull(fileinfos); + for (FileInfo fi : fileinfos) { + Assertions.assertEquals(TEST_FILE_ID, fi.getFileId()); + Assertions.assertEquals(TEST_CHECKSUM, fi.getChecksum()); + Assertions.assertEquals( + CalendarUtils.convertFromXMLGregorianCalendarToInstant(csData.getFirst().getCalculationTimestamp()), fi.getDateForLastChecksumCheckInstant()); - } + } - addStep("Check that the extra collection is untouched by the ingest", - "should deliver an empty collection and no errors"); - Assertions.assertEquals(Long.valueOf(1), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); - Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); + addStep("Check that the extra collection is untouched by the ingest", + "should deliver an empty collection and no errors"); + Assertions.assertEquals(Long.valueOf(1), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); + Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); + } } @@ -267,81 +288,83 @@ void testIngestOfChecksumsData() throws Exception { @Tag("regressiontest") @Tag("databasetest") @Tag("integritytest") - void testDeletingEntry() throws Exception { + void testDeletingEntry() { addDescription("Tests the deletion of an FileID entry from a collection. " + - "Checks that it does not effect another collection with a fileID equal to the deleted"); - IntegrityDAO cache = createDAO(); - Collection fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); - Assertions.assertNotNull(fileinfos); - Assertions.assertEquals(0, fileinfos.size()); - - addStep("Create data", "Should be ingested into the database"); - FileIDsData data1 = getFileIDsData(TEST_FILE_ID); - cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); - - cache.updateFileIDs(data1, TEST_PILLAR_1, EXTRA_COLLECTION); - cache.updateFileIDs(data1, EXTRA_PILLAR, EXTRA_COLLECTION); - - addStep("Ensure that the data is present", "the data is present"); - fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); - Assertions.assertNotNull(fileinfos); - Assertions.assertEquals(2, fileinfos.size()); - fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, EXTRA_COLLECTION); - Assertions.assertNotNull(fileinfos); - Assertions.assertEquals(2, fileinfos.size()); - - addStep("Delete the entry for the first pillar", - "No fileinfos should be extracted from the pillar in the collection."); - cache.removeFile(TEST_COLLECTIONID, TEST_PILLAR_1, TEST_FILE_ID); - List fis = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); - Assertions.assertNotNull(fis); - Assertions.assertEquals(1, fis.size()); - Assertions.assertEquals(TEST_PILLAR_2, fis.get(0).getPillarId()); - - addStep("Delete the entry for the second pillar", - "No fileinfos should be extracted from the collection."); - cache.removeFile(TEST_COLLECTIONID, TEST_PILLAR_2, TEST_FILE_ID); - fis = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); - Assertions.assertNotNull(fis); - Assertions.assertEquals(0, fis.size()); - - addStep("Check that the data in the extra collection is still present", - "the data is present"); - fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, EXTRA_COLLECTION); - Assertions.assertNotNull(fileinfos); - Assertions.assertEquals(2, fileinfos.size()); + "Checks that it does not effect another collection with a fileID equal to the deleted"); + try (IntegrityDAO cache = createDAO()) { + Collection fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); + Assertions.assertNotNull(fileinfos); + Assertions.assertEquals(0, fileinfos.size()); + + addStep("Create data", "Should be ingested into the database"); + FileIDsData data1 = getFileIDsData(TEST_FILE_ID); + cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); + + cache.updateFileIDs(data1, TEST_PILLAR_1, EXTRA_COLLECTION); + cache.updateFileIDs(data1, EXTRA_PILLAR, EXTRA_COLLECTION); + + addStep("Ensure that the data is present", "the data is present"); + fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); + Assertions.assertNotNull(fileinfos); + Assertions.assertEquals(2, fileinfos.size()); + fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, EXTRA_COLLECTION); + Assertions.assertNotNull(fileinfos); + Assertions.assertEquals(2, fileinfos.size()); + + addStep("Delete the entry for the first pillar", + "No fileinfos should be extracted from the pillar in the collection."); + cache.removeFile(TEST_COLLECTIONID, TEST_PILLAR_1, TEST_FILE_ID); + List fis = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); + Assertions.assertNotNull(fis); + Assertions.assertEquals(1, fis.size()); + Assertions.assertEquals(TEST_PILLAR_2, fis.get(0).getPillarId()); + + addStep("Delete the entry for the second pillar", + "No fileinfos should be extracted from the collection."); + cache.removeFile(TEST_COLLECTIONID, TEST_PILLAR_2, TEST_FILE_ID); + fis = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); + Assertions.assertNotNull(fis); + Assertions.assertEquals(0, fis.size()); + + addStep("Check that the data in the extra collection is still present", + "the data is present"); + fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, EXTRA_COLLECTION); + Assertions.assertNotNull(fileinfos); + Assertions.assertEquals(2, fileinfos.size()); + } } @Test @Tag("regressiontest") @Tag("databasetest") @Tag("integritytest") - void testDeletingNonExistingEntry() throws Exception { + void testDeletingNonExistingEntry() { addDescription("Tests the deletion of an nonexisting FileID entry."); - IntegrityDAO cache = createDAO(); + try (IntegrityDAO cache = createDAO()) { - String nonexistingFileEntry = "NON-EXISTING-FILE-ENTRY" + Instant.now().toEpochMilli(); + String nonexistingFileEntry = "NON-EXISTING-FILE-ENTRY" + Instant.now().toEpochMilli(); - addStep("Create data", "Should be ingested into the database"); - FileIDsData data1 = getFileIDsData(TEST_FILE_ID); - cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); + addStep("Create data", "Should be ingested into the database"); + FileIDsData data1 = getFileIDsData(TEST_FILE_ID); + cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); - Collection fileinfos = cache.getFileInfosForFile(nonexistingFileEntry, TEST_COLLECTIONID); - Assertions.assertNotNull(fileinfos); - Assertions.assertEquals(0, fileinfos.size()); + Collection fileinfos = cache.getFileInfosForFile(nonexistingFileEntry, TEST_COLLECTIONID); + Assertions.assertNotNull(fileinfos); + Assertions.assertEquals(0, fileinfos.size()); - fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); - Assertions.assertNotNull(fileinfos); - Assertions.assertEquals(2, fileinfos.size()); + fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); + Assertions.assertNotNull(fileinfos); + Assertions.assertEquals(2, fileinfos.size()); - addStep("Delete a nonexisting entry", "Should not change the state of the database."); - cache.removeFile(TEST_COLLECTIONID, TEST_PILLAR_1, nonexistingFileEntry); - cache.removeFile(TEST_COLLECTIONID, TEST_PILLAR_2, nonexistingFileEntry); - fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); - Assertions.assertNotNull(fileinfos); - Assertions.assertEquals(2, fileinfos.size()); + addStep("Delete a nonexisting entry", "Should not change the state of the database."); + cache.removeFile(TEST_COLLECTIONID, TEST_PILLAR_1, nonexistingFileEntry); + cache.removeFile(TEST_COLLECTIONID, TEST_PILLAR_2, nonexistingFileEntry); + fileinfos = cache.getFileInfosForFile(TEST_FILE_ID, TEST_COLLECTIONID); + Assertions.assertNotNull(fileinfos); + Assertions.assertEquals(2, fileinfos.size()); + } } @Test @@ -350,70 +373,74 @@ void testDeletingNonExistingEntry() throws Exception { @Tag("integritytest") void testFindOrphanFiles() throws Exception { addDescription("Tests the ability to find orphan files."); - IntegrityDAO cache = createDAO(); - - addStep("Create data", "Should be ingested into the database"); - String orphanFile = "orphan"; - String existingFile = "existing"; - FileIDsData data1 = getFileIDsData(existingFile); - FileIDsData data3 = getFileIDsData(orphanFile); - cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); - cache.updateFileIDs(data3, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(data3, TEST_PILLAR_2, TEST_COLLECTIONID); - Assertions.assertEquals(Long.valueOf(2), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); - Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); - Thread.sleep(100); - Instant updateTime = Instant.now(); - cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); - cache.updateFileIDs(data3, TEST_PILLAR_1, TEST_COLLECTIONID); - - List orphanFilesPillar1 = getIssuesFromIterator(cache.getOrphanFilesOnPillar(TEST_COLLECTIONID, - TEST_PILLAR_1, updateTime)); - Assertions.assertEquals(0, orphanFilesPillar1.size()); - List orphanFilesPillar2 = getIssuesFromIterator(cache.getOrphanFilesOnPillar(TEST_COLLECTIONID, - TEST_PILLAR_2, updateTime)); - Assertions.assertEquals(1, orphanFilesPillar2.size()); + try (IntegrityDAO cache = createDAO()) { + + addStep("Create data", "Should be ingested into the database"); + String orphanFile = "orphan"; + String existingFile = "existing"; + FileIDsData data1 = getFileIDsData(existingFile); + FileIDsData data3 = getFileIDsData(orphanFile); + cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); + cache.updateFileIDs(data3, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(data3, TEST_PILLAR_2, TEST_COLLECTIONID); + Assertions.assertEquals(Long.valueOf(2), cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); + Assertions.assertEquals(Long.valueOf(0), cache.getNumberOfFilesInCollection(EXTRA_COLLECTION)); + Thread.sleep(100); + Instant updateTime = Instant.now(); + cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); + cache.updateFileIDs(data3, TEST_PILLAR_1, TEST_COLLECTIONID); + + List orphanFilesPillar1 = getIssuesFromIterator(cache.getOrphanFilesOnPillar(TEST_COLLECTIONID, + TEST_PILLAR_1, + updateTime)); + Assertions.assertEquals(0, orphanFilesPillar1.size()); + List orphanFilesPillar2 = getIssuesFromIterator(cache.getOrphanFilesOnPillar(TEST_COLLECTIONID, + TEST_PILLAR_2, + updateTime)); + Assertions.assertEquals(1, orphanFilesPillar2.size()); + } } @Test @Tag("regressiontest") @Tag("databasetest") @Tag("integritytest") - void testFindInconsistentChecksum() throws Exception { + void testFindInconsistentChecksum() { addDescription("Testing the localization of inconsistent checksums"); - IntegrityDAO cache = createDAO(); - - String checksum1_1 = "11"; - String checksum1_2 = "12"; - String checksum3 = "33"; - String checksum2_1 = "21"; - String checksum2_2 = "22"; - - String BAD_FILE_ID_1 = "BAD-FILE-1"; - String BAD_FILE_ID_2 = "BAD-FILE-2"; - String GOOD_FILE_ID = "GOOD-FILE"; - - addStep("Update the database with 2 inconsistent files and one consistent file.", - "Ingesting the data into the database"); - List csData1_1 = getChecksumResults(BAD_FILE_ID_1, checksum1_1); - List csData1_2 = getChecksumResults(BAD_FILE_ID_2, checksum1_2); - List csData1_3 = getChecksumResults(GOOD_FILE_ID, checksum3); - cache.updateChecksums(csData1_1, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateChecksums(csData1_2, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateChecksums(csData1_3, TEST_PILLAR_1, TEST_COLLECTIONID); - List csData2_1 = getChecksumResults(BAD_FILE_ID_1, checksum2_1); - List csData2_2 = getChecksumResults(BAD_FILE_ID_2, checksum2_2); - List csData2_3 = getChecksumResults(GOOD_FILE_ID, checksum3); - cache.updateChecksums(csData2_1, TEST_PILLAR_2, TEST_COLLECTIONID); - cache.updateChecksums(csData2_2, TEST_PILLAR_2, TEST_COLLECTIONID); - cache.updateChecksums(csData2_3, TEST_PILLAR_2, TEST_COLLECTIONID); - - addStep("Find the files with inconsistent checksums", "Bad file 1 and 2"); - List filesWithChecksumError - = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); - Assertions.assertEquals(Arrays.asList(BAD_FILE_ID_1, BAD_FILE_ID_2), filesWithChecksumError); + try (IntegrityDAO cache = createDAO()) { + + String checksum1_1 = "11"; + String checksum1_2 = "12"; + String checksum3 = "33"; + String checksum2_1 = "21"; + String checksum2_2 = "22"; + + String BAD_FILE_ID_1 = "BAD-FILE-1"; + String BAD_FILE_ID_2 = "BAD-FILE-2"; + String GOOD_FILE_ID = "GOOD-FILE"; + + addStep("Update the database with 2 inconsistent files and one consistent file.", + "Ingesting the data into the database"); + List csData1_1 = getChecksumResults(BAD_FILE_ID_1, checksum1_1); + List csData1_2 = getChecksumResults(BAD_FILE_ID_2, checksum1_2); + List csData1_3 = getChecksumResults(GOOD_FILE_ID, checksum3); + cache.updateChecksums(csData1_1, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateChecksums(csData1_2, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateChecksums(csData1_3, TEST_PILLAR_1, TEST_COLLECTIONID); + List csData2_1 = getChecksumResults(BAD_FILE_ID_1, checksum2_1); + List csData2_2 = getChecksumResults(BAD_FILE_ID_2, checksum2_2); + List csData2_3 = getChecksumResults(GOOD_FILE_ID, checksum3); + cache.updateChecksums(csData2_1, TEST_PILLAR_2, TEST_COLLECTIONID); + cache.updateChecksums(csData2_2, TEST_PILLAR_2, TEST_COLLECTIONID); + cache.updateChecksums(csData2_3, TEST_PILLAR_2, TEST_COLLECTIONID); + + addStep("Find the files with inconsistent checksums", "Bad file 1 and 2"); + List filesWithChecksumError + = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); + Assertions.assertEquals(Arrays.asList(BAD_FILE_ID_1, BAD_FILE_ID_2), filesWithChecksumError); + } } @Test @@ -422,18 +449,19 @@ void testFindInconsistentChecksum() throws Exception { @Tag("integritytest") void testNoChecksums() { addDescription("Testing the checksum validation, when no checksums exists."); - IntegrityDAO cache = createDAO(); - - addStep("Update the database with 2 inconsistent files and one consistent file.", - "Ingesting the data into the database"); - FileIDsData data1 = getFileIDsData(TEST_FILE_ID); - cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); - - addStep("Finding the files with inconsistent checksums", "No checksum thus no errors"); - List filesWithChecksumError - = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); - Assertions.assertEquals(Collections.emptyList(), filesWithChecksumError); + try (IntegrityDAO cache = createDAO()) { + + addStep("Update the database with 2 inconsistent files and one consistent file.", + "Ingesting the data into the database"); + FileIDsData data1 = getFileIDsData(TEST_FILE_ID); + cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(data1, TEST_PILLAR_2, TEST_COLLECTIONID); + + addStep("Finding the files with inconsistent checksums", "No checksum thus no errors"); + List filesWithChecksumError + = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); + Assertions.assertEquals(Collections.emptyList(), filesWithChecksumError); + } } @Test @@ -442,28 +470,29 @@ void testNoChecksums() { @Tag("integritytest") void testMissingChecksums() { addDescription("Testing the checksum validation, when only one pillar has a checksum for a file."); - IntegrityDAO cache = createDAO(); - - Instant testStart = Instant.now(); - addStep("Update the database with 1 file, missing its checksum on one pillar.", - "Ingesting the data into the database"); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_2, TEST_COLLECTIONID); - cache.updateChecksums(getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM), TEST_PILLAR_1, TEST_COLLECTIONID); - - addStep("Finding the files with inconsistent checksums", "No checksum thus no errors"); - List filesWithChecksumError - = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); - Assertions.assertEquals(Collections.emptyList(), filesWithChecksumError); - - List fileWithMissingChecksumPillar1 - = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_1, - testStart)); - Assertions.assertEquals(Collections.emptyList(), fileWithMissingChecksumPillar1); - List fileWithMissingChecksumPillar2 - = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_2, - testStart)); - Assertions.assertEquals(Collections.singletonList(TEST_FILE_ID), fileWithMissingChecksumPillar2); + try (IntegrityDAO cache = createDAO()) { + + Instant testStart = Instant.now(); + addStep("Update the database with 1 file, missing its checksum on one pillar.", + "Ingesting the data into the database"); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_2, TEST_COLLECTIONID); + cache.updateChecksums(getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM), TEST_PILLAR_1, TEST_COLLECTIONID); + + addStep("Finding the files with inconsistent checksums", "No checksum thus no errors"); + List filesWithChecksumError + = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); + Assertions.assertEquals(Collections.emptyList(), filesWithChecksumError); + + List fileWithMissingChecksumPillar1 + = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_1, + testStart)); + Assertions.assertEquals(Collections.emptyList(), fileWithMissingChecksumPillar1); + List fileWithMissingChecksumPillar2 + = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_2, + testStart)); + Assertions.assertEquals(Collections.singletonList(TEST_FILE_ID), fileWithMissingChecksumPillar2); + } } @Test @@ -472,47 +501,48 @@ void testMissingChecksums() { @Tag("integritytest") void testMissingChecksumsChecksumNotUpdated() throws Exception { addDescription("Testing the checksum validation, when only one pillar has a checksum for a file."); - IntegrityDAO cache = createDAO(); - - Instant testStart = Instant.now(); - addStep("Update the database with 1 file, no missing checksums.", - "Ingesting the data into the database"); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_2, TEST_COLLECTIONID); - cache.updateChecksums(getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM), TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateChecksums(getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM), TEST_PILLAR_2, TEST_COLLECTIONID); - - addStep("Finding the files with inconsistent checksums", "No checksum thus no errors"); - List filesWithChecksumError - = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); - Assertions.assertEquals(Collections.emptyList(), filesWithChecksumError); - - List fileWithMissingChecksumPillar1 - = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_1, - testStart)); - Assertions.assertEquals(Collections.emptyList(), fileWithMissingChecksumPillar1); - List fileWithMissingChecksumPillar2 - = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_2, - testStart)); - Assertions.assertEquals(Collections.emptyList(), fileWithMissingChecksumPillar2); - - addStep("Updating the checksum for one pillar, and checking that the other pillars checksum is now missing", - "The second pillar is reported to be missing the checksum for the file"); - Instant secondUpdate = Instant.now(); - Thread.sleep(1000); - cache.updateChecksums(getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM), TEST_PILLAR_1, TEST_COLLECTIONID); - addStep("Finding the files with inconsistent checksums", "No checksum thus no errors"); - filesWithChecksumError = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); - Assertions.assertEquals(Collections.emptyList(), filesWithChecksumError); - - fileWithMissingChecksumPillar1 - = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_1, - secondUpdate)); - Assertions.assertEquals(Collections.emptyList(), fileWithMissingChecksumPillar1); - fileWithMissingChecksumPillar2 - = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_2, - secondUpdate)); - Assertions.assertEquals(Collections.singletonList(TEST_FILE_ID), fileWithMissingChecksumPillar2); + try (IntegrityDAO cache = createDAO()) { + + Instant testStart = Instant.now(); + addStep("Update the database with 1 file, no missing checksums.", + "Ingesting the data into the database"); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_2, TEST_COLLECTIONID); + cache.updateChecksums(getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM), TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateChecksums(getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM), TEST_PILLAR_2, TEST_COLLECTIONID); + + addStep("Finding the files with inconsistent checksums", "No checksum thus no errors"); + List filesWithChecksumError + = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); + Assertions.assertEquals(Collections.emptyList(), filesWithChecksumError); + + List fileWithMissingChecksumPillar1 + = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_1, + testStart)); + Assertions.assertEquals(Collections.emptyList(), fileWithMissingChecksumPillar1); + List fileWithMissingChecksumPillar2 + = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_2, + testStart)); + Assertions.assertEquals(Collections.emptyList(), fileWithMissingChecksumPillar2); + + addStep("Updating the checksum for one pillar, and checking that the other pillars checksum is now missing", + "The second pillar is reported to be missing the checksum for the file"); + Instant secondUpdate = Instant.now(); + Thread.sleep(1000); + cache.updateChecksums(getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM), TEST_PILLAR_1, TEST_COLLECTIONID); + addStep("Finding the files with inconsistent checksums", "No checksum thus no errors"); + filesWithChecksumError = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); + Assertions.assertEquals(Collections.emptyList(), filesWithChecksumError); + + fileWithMissingChecksumPillar1 + = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_1, + secondUpdate)); + Assertions.assertEquals(Collections.emptyList(), fileWithMissingChecksumPillar1); + fileWithMissingChecksumPillar2 + = getIssuesFromIterator(cache.getFilesWithMissingChecksums(TEST_COLLECTIONID, TEST_PILLAR_2, + secondUpdate)); + Assertions.assertEquals(Collections.singletonList(TEST_FILE_ID), fileWithMissingChecksumPillar2); + } } @@ -522,32 +552,37 @@ void testMissingChecksumsChecksumNotUpdated() throws Exception { @Tag("integritytest") void testOutdatedChecksums() { addDescription("Testing the checksum validation, when only one pillar has a checksum for a file."); - IntegrityDAO cache = createDAO(); - - Instant maxDate = Instant.now().minusSeconds(10); - - addStep("Update the database with one file, one pillar having an outdated checksum.", - "Ingesting the data into the database"); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_2, TEST_COLLECTIONID); - cache.updateChecksums(getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM), TEST_PILLAR_1, TEST_COLLECTIONID); - - List checksumData = getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM); - checksumData.get(0).setCalculationTimestamp(CalendarUtils.getEpoch()); - cache.updateChecksums(checksumData, TEST_PILLAR_2, TEST_COLLECTIONID); - - addStep("Finding the files with inconsistent checksums", "No checksum thus no errors"); - List filesWithChecksumError - = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); - Assertions.assertEquals(Collections.emptyList(), filesWithChecksumError); - - List fileWithOutdatedChecksumsPillar1 - = getIssuesFromIterator(cache.getFilesWithOutdatedChecksums(TEST_COLLECTIONID, TEST_PILLAR_1, maxDate)); - Assertions.assertEquals(Collections.emptyList(), fileWithOutdatedChecksumsPillar1); - - List fileWithOutdatedChecksumPillar2 - = getIssuesFromIterator(cache.getFilesWithOutdatedChecksums(TEST_COLLECTIONID, TEST_PILLAR_2, maxDate)); - Assertions.assertEquals(Collections.singletonList(TEST_FILE_ID), fileWithOutdatedChecksumPillar2); + try (IntegrityDAO cache = createDAO()) { + + Instant maxDate = Instant.now().minusSeconds(10); + + addStep("Update the database with one file, one pillar having an outdated checksum.", + "Ingesting the data into the database"); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_2, TEST_COLLECTIONID); + cache.updateChecksums(getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM), TEST_PILLAR_1, TEST_COLLECTIONID); + + List checksumData = getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM); + checksumData.get(0).setCalculationTimestamp(CalendarUtils.getEpoch()); + cache.updateChecksums(checksumData, TEST_PILLAR_2, TEST_COLLECTIONID); + + addStep("Finding the files with inconsistent checksums", "No checksum thus no errors"); + List filesWithChecksumError + = getIssuesFromIterator(cache.findFilesWithChecksumInconsistencies(TEST_COLLECTIONID)); + Assertions.assertEquals(Collections.emptyList(), filesWithChecksumError); + + List fileWithOutdatedChecksumsPillar1 + = getIssuesFromIterator(cache.getFilesWithOutdatedChecksums(TEST_COLLECTIONID, + TEST_PILLAR_1, + maxDate)); + Assertions.assertEquals(Collections.emptyList(), fileWithOutdatedChecksumsPillar1); + + List fileWithOutdatedChecksumPillar2 + = getIssuesFromIterator(cache.getFilesWithOutdatedChecksums(TEST_COLLECTIONID, + TEST_PILLAR_2, + maxDate)); + Assertions.assertEquals(Collections.singletonList(TEST_FILE_ID), fileWithOutdatedChecksumPillar2); + } } @Test @@ -556,38 +591,42 @@ void testOutdatedChecksums() { @Tag("integritytest") void testExtractingAllKnownFilesForPillars() { addDescription("Tests that known files can be extracted for specific pillars."); - IntegrityDAO cache = createDAO(); - String file2 = TEST_FILE_ID + "-2"; - String file3 = TEST_FILE_ID + "-3"; - - addStep("Insert two files into database for a pillar", - "Ingesting the data into the database"); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID, file2), TEST_PILLAR_1, TEST_COLLECTIONID); - addStep("Insert a file to the extra collection for the common pillar", - "Data is ingested into the database"); - cache.updateFileIDs(getFileIDsData(file3), TEST_PILLAR_1, EXTRA_COLLECTION); - - addStep("Extract all the existing file ids for the pillar for collection '" + TEST_COLLECTIONID + "'", - "Both file ids is found."); - IntegrityIssueIterator it = cache.getAllFileIDsOnPillar(TEST_COLLECTIONID, TEST_PILLAR_1, 0L, Long.MAX_VALUE); - Collection fileIDs = getIssuesFromIterator(it); - Assertions.assertEquals(2, fileIDs.size(), "Number of files: " + fileIDs.size()); - Assertions.assertTrue(fileIDs.contains(TEST_FILE_ID)); - Assertions.assertTrue(fileIDs.contains(file2)); - Assertions.assertFalse(fileIDs.contains(file3)); - - addStep("Extract the single fileID for the extra collection", "Only the one file id exists"); - it = cache.getAllFileIDsOnPillar(EXTRA_COLLECTION, TEST_PILLAR_1, 0L, Long.MAX_VALUE); - fileIDs = getIssuesFromIterator(it); - Assertions.assertEquals(1, fileIDs.size(), "Number of files: " + fileIDs.size()); - Assertions.assertTrue(fileIDs.contains(file3)); - Assertions.assertFalse(fileIDs.contains(file2)); - Assertions.assertFalse(fileIDs.contains(TEST_FILE_ID)); - - addStep("Extract all the existing file ids for another pillar", "No files are found."); - it = cache.getAllFileIDsOnPillar(TEST_COLLECTIONID, TEST_PILLAR_2, 0L, Long.MAX_VALUE); - fileIDs = getIssuesFromIterator(it); - Assertions.assertTrue(fileIDs.isEmpty()); + try (IntegrityDAO cache = createDAO()) { + String file2 = TEST_FILE_ID + "-2"; + String file3 = TEST_FILE_ID + "-3"; + + addStep("Insert two files into database for a pillar", + "Ingesting the data into the database"); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID, file2), TEST_PILLAR_1, TEST_COLLECTIONID); + addStep("Insert a file to the extra collection for the common pillar", + "Data is ingested into the database"); + cache.updateFileIDs(getFileIDsData(file3), TEST_PILLAR_1, EXTRA_COLLECTION); + + addStep("Extract all the existing file ids for the pillar for collection '" + TEST_COLLECTIONID + "'", + "Both file ids is found."); + IntegrityIssueIterator it = cache.getAllFileIDsOnPillar(TEST_COLLECTIONID, + TEST_PILLAR_1, + 0L, + Long.MAX_VALUE); + Collection fileIDs = getIssuesFromIterator(it); + Assertions.assertEquals(2, fileIDs.size(), "Number of files: " + fileIDs.size()); + Assertions.assertTrue(fileIDs.contains(TEST_FILE_ID)); + Assertions.assertTrue(fileIDs.contains(file2)); + Assertions.assertFalse(fileIDs.contains(file3)); + + addStep("Extract the single fileID for the extra collection", "Only the one file id exists"); + it = cache.getAllFileIDsOnPillar(EXTRA_COLLECTION, TEST_PILLAR_1, 0L, Long.MAX_VALUE); + fileIDs = getIssuesFromIterator(it); + Assertions.assertEquals(1, fileIDs.size(), "Number of files: " + fileIDs.size()); + Assertions.assertTrue(fileIDs.contains(file3)); + Assertions.assertFalse(fileIDs.contains(file2)); + Assertions.assertFalse(fileIDs.contains(TEST_FILE_ID)); + + addStep("Extract all the existing file ids for another pillar", "No files are found."); + it = cache.getAllFileIDsOnPillar(TEST_COLLECTIONID, TEST_PILLAR_2, 0L, Long.MAX_VALUE); + fileIDs = getIssuesFromIterator(it); + Assertions.assertTrue(fileIDs.isEmpty()); + } } @Test @@ -596,23 +635,24 @@ void testExtractingAllKnownFilesForPillars() { @Tag("integritytest") void testExtractingAllKnownFilesForPillarsLimits() { addDescription("Tests the limits for extracting files for specific pillars."); - IntegrityDAO cache = createDAO(); - String file2 = TEST_FILE_ID + "-2"; - - addStep("Insert two files into database for a pillar", "Ingesting the data into the database"); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID, file2), TEST_PILLAR_1, TEST_COLLECTIONID); - - addStep("Extract with a maximum of 1", "The first file."); - IntegrityIssueIterator it = cache.getAllFileIDsOnPillar(TEST_COLLECTIONID, TEST_PILLAR_1, 0L, 1L); - Collection fileIDs = getIssuesFromIterator(it); - Assertions.assertEquals(1, fileIDs.size()); - Assertions.assertTrue(fileIDs.contains(TEST_FILE_ID)); - - addStep("Extract with a minimum of 1 and maximum of infinite", "The last file."); - it = cache.getAllFileIDsOnPillar(TEST_COLLECTIONID, TEST_PILLAR_1, 1L, Long.MAX_VALUE); - fileIDs = getIssuesFromIterator(it); - Assertions.assertEquals(1, fileIDs.size()); - Assertions.assertTrue(fileIDs.contains(file2)); + try (IntegrityDAO cache = createDAO()) { + String file2 = TEST_FILE_ID + "-2"; + + addStep("Insert two files into database for a pillar", "Ingesting the data into the database"); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID, file2), TEST_PILLAR_1, TEST_COLLECTIONID); + + addStep("Extract with a maximum of 1", "The first file."); + IntegrityIssueIterator it = cache.getAllFileIDsOnPillar(TEST_COLLECTIONID, TEST_PILLAR_1, 0L, 1L); + Collection fileIDs = getIssuesFromIterator(it); + Assertions.assertEquals(1, fileIDs.size()); + Assertions.assertTrue(fileIDs.contains(TEST_FILE_ID)); + + addStep("Extract with a minimum of 1 and maximum of infinite", "The last file."); + it = cache.getAllFileIDsOnPillar(TEST_COLLECTIONID, TEST_PILLAR_1, 1L, Long.MAX_VALUE); + fileIDs = getIssuesFromIterator(it); + Assertions.assertEquals(1, fileIDs.size()); + Assertions.assertTrue(fileIDs.contains(file2)); + } } @Test @@ -621,26 +661,27 @@ void testExtractingAllKnownFilesForPillarsLimits() { @Tag("integritytest") void testExtractingAllMissingFiles() { addDescription("Tests that missing files can be extracted."); - IntegrityDAO cache = createDAO(); - String file2 = TEST_FILE_ID + "-2"; - - addStep("Insert two files into database for a pillar and mark them as missing", - "Ingesting the data into the database"); - - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID, file2), TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_2, TEST_COLLECTIONID); - - addStep("Check the number of files in collection and on pillars", - "The collection should have two files, the first pillar two, the second one"); - Assertions.assertEquals(2, (long) cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); - Map metrics = cache.getPillarCollectionMetrics(TEST_COLLECTIONID); - Assertions.assertEquals(2, metrics.get(TEST_PILLAR_1).getPillarFileCount()); - Assertions.assertEquals(1, metrics.get(TEST_PILLAR_2).getPillarFileCount()); - - addStep("Extract missing files", "one file should be missing"); - List missingFiles - = getIssuesFromIterator(cache.findFilesWithMissingCopies(TEST_COLLECTIONID, 2, 0L, 10L)); - Assertions.assertEquals(Collections.singletonList(file2), missingFiles); + try (IntegrityDAO cache = createDAO()) { + String file2 = TEST_FILE_ID + "-2"; + + addStep("Insert two files into database for a pillar and mark them as missing", + "Ingesting the data into the database"); + + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID, file2), TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_2, TEST_COLLECTIONID); + + addStep("Check the number of files in collection and on pillars", + "The collection should have two files, the first pillar two, the second one"); + Assertions.assertEquals(2, (long) cache.getNumberOfFilesInCollection(TEST_COLLECTIONID)); + Map metrics = cache.getPillarCollectionMetrics(TEST_COLLECTIONID); + Assertions.assertEquals(2, metrics.get(TEST_PILLAR_1).getPillarFileCount()); + Assertions.assertEquals(1, metrics.get(TEST_PILLAR_2).getPillarFileCount()); + + addStep("Extract missing files", "one file should be missing"); + List missingFiles + = getIssuesFromIterator(cache.findFilesWithMissingCopies(TEST_COLLECTIONID, 2, 0L, 10L)); + Assertions.assertEquals(Collections.singletonList(file2), missingFiles); + } } @Test @@ -649,26 +690,27 @@ void testExtractingAllMissingFiles() { @Tag("integritytest") void testExtractingAllMissingFilesForPillarsLimits() { addDescription("Tests the limits for extracting missing files for specific pillars."); - IntegrityDAO cache = createDAO(); - String file2 = TEST_FILE_ID + "-2"; - String file3 = TEST_FILE_ID + "-3"; - - addStep("Insert two files into database for a pillar and set them to missing", - "Ingesting the data into the database"); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID, file2, file3), TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_2, TEST_COLLECTIONID); - - addStep("Extract with a maximum of 1", "The first file."); - IntegrityIssueIterator it = cache.findFilesWithMissingCopies(TEST_COLLECTIONID, 2, 0L, 1L); - Collection fileIDs = getIssuesFromIterator(it); - Assertions.assertEquals(1, fileIDs.size()); - Assertions.assertTrue(fileIDs.contains(file2)); - - addStep("Extract with a minimum of 1 and maximum of infinite", "The last file."); - it = cache.findFilesWithMissingCopies(TEST_COLLECTIONID, 2, 1L, Long.MAX_VALUE); - fileIDs = getIssuesFromIterator(it); - Assertions.assertEquals(1, fileIDs.size()); - Assertions.assertTrue(fileIDs.contains(file3)); + try (IntegrityDAO cache = createDAO()) { + String file2 = TEST_FILE_ID + "-2"; + String file3 = TEST_FILE_ID + "-3"; + + addStep("Insert two files into database for a pillar and set them to missing", + "Ingesting the data into the database"); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID, file2, file3), TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(getFileIDsData(TEST_FILE_ID), TEST_PILLAR_2, TEST_COLLECTIONID); + + addStep("Extract with a maximum of 1", "The first file."); + IntegrityIssueIterator it = cache.findFilesWithMissingCopies(TEST_COLLECTIONID, 2, 0L, 1L); + Collection fileIDs = getIssuesFromIterator(it); + Assertions.assertEquals(1, fileIDs.size()); + Assertions.assertTrue(fileIDs.contains(file2)); + + addStep("Extract with a minimum of 1 and maximum of infinite", "The last file."); + it = cache.findFilesWithMissingCopies(TEST_COLLECTIONID, 2, 1L, Long.MAX_VALUE); + fileIDs = getIssuesFromIterator(it); + Assertions.assertEquals(1, fileIDs.size()); + Assertions.assertTrue(fileIDs.contains(file3)); + } } @Test @@ -677,33 +719,36 @@ void testExtractingAllMissingFilesForPillarsLimits() { @Tag("integritytest") void testGetLatestFileDateEntryForCollection() { addDescription("Tests that checksum date entries can be retrieved and manipulated."); - IntegrityDAO cache = createDAO(); + try (IntegrityDAO cache = createDAO()) { - addStep("Create data", "Should be ingested into the database"); + addStep("Create data", "Should be ingested into the database"); - Assertions.assertNull(cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); - Assertions.assertNull(cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); + Assertions.assertNull(cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); + Assertions.assertNull(cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); - FileIDsData fidsPillar1 = getFileIDsData(TEST_FILE_ID); - Instant expectedLatestFileDatePillar1 = CalendarUtils.convertFromXMLGregorianCalendarToInstant( - fidsPillar1.getFileIDsDataItems().getFileIDsDataItem().get(0).getLastModificationTime()); - cache.updateFileIDs(fidsPillar1, TEST_PILLAR_1, TEST_COLLECTIONID); + FileIDsData fidsPillar1 = getFileIDsData(TEST_FILE_ID); + Instant expectedLatestFileDatePillar1 = CalendarUtils.convertFromXMLGregorianCalendarToInstant( + fidsPillar1.getFileIDsDataItems().getFileIDsDataItem().get(0).getLastModificationTime()); + cache.updateFileIDs(fidsPillar1, TEST_PILLAR_1, TEST_COLLECTIONID); - FileIDsData fidsPillar2 = getFileIDsData(TEST_FILE_ID); - Instant expectedLatestFileDatePillar2 = expectedLatestFileDatePillar1.plusMillis(100); - fidsPillar2.getFileIDsDataItems().getFileIDsDataItem().get(0) - .setLastModificationTime(CalendarUtils.getXmlGregorianCalendar(expectedLatestFileDatePillar2)); - cache.updateFileIDs(fidsPillar2, TEST_PILLAR_2, TEST_COLLECTIONID); + FileIDsData fidsPillar2 = getFileIDsData(TEST_FILE_ID); + Instant expectedLatestFileDatePillar2 = expectedLatestFileDatePillar1.plusMillis(100); + fidsPillar2.getFileIDsDataItems().getFileIDsDataItem().get(0) + .setLastModificationTime(CalendarUtils.getXmlGregorianCalendar(expectedLatestFileDatePillar2)); + cache.updateFileIDs(fidsPillar2, TEST_PILLAR_2, TEST_COLLECTIONID); - Assertions.assertEquals(expectedLatestFileDatePillar1, cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); - Assertions.assertEquals(expectedLatestFileDatePillar2, cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); + Assertions.assertEquals(expectedLatestFileDatePillar1, + cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); + Assertions.assertEquals(expectedLatestFileDatePillar2, + cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); - Assertions.assertEquals(cache.getLatestFileInstantInCollection(TEST_COLLECTIONID), - cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); + Assertions.assertEquals(cache.getLatestFileInstantInCollection(TEST_COLLECTIONID), + cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); - cache.resetFileCollectionProgress(TEST_COLLECTIONID); - Assertions.assertNull(cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); - Assertions.assertNull(cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); + cache.resetFileCollectionProgress(TEST_COLLECTIONID); + Assertions.assertNull(cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); + Assertions.assertNull(cache.getLatestFileInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); + } } @Test @@ -712,23 +757,27 @@ void testGetLatestFileDateEntryForCollection() { @Tag("integritytest") void testGetLatestChecksumDateEntryForCollection() { addDescription("Tests that checksum date entries can be retrieved and manipulated."); - IntegrityDAO cache = createDAO(); - - addStep("Create data", "Should be ingested into the database"); - - Assertions.assertNull(cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); - Assertions.assertNull(cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); - - List csData = getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM); - cache.updateChecksums(csData, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateChecksums(csData, TEST_PILLAR_2, TEST_COLLECTIONID); - Instant expectedLatestChecksum = CalendarUtils.convertFromXMLGregorianCalendarToInstant(csData.get(0).getCalculationTimestamp()); - Assertions.assertEquals(expectedLatestChecksum, cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); - Assertions.assertEquals(expectedLatestChecksum, cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); - - cache.resetChecksumCollectionProgress(TEST_COLLECTIONID); - Assertions.assertNull(cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); - Assertions.assertNull(cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); + try (IntegrityDAO cache = createDAO()) { + + addStep("Create data", "Should be ingested into the database"); + + Assertions.assertNull(cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); + Assertions.assertNull(cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); + + List csData = getChecksumResults(TEST_FILE_ID, TEST_CHECKSUM); + cache.updateChecksums(csData, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateChecksums(csData, TEST_PILLAR_2, TEST_COLLECTIONID); + Instant expectedLatestChecksum = CalendarUtils.convertFromXMLGregorianCalendarToInstant(csData.get(0) + .getCalculationTimestamp()); + Assertions.assertEquals(expectedLatestChecksum, + cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); + Assertions.assertEquals(expectedLatestChecksum, + cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); + + cache.resetChecksumCollectionProgress(TEST_COLLECTIONID); + Assertions.assertNull(cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_1)); + Assertions.assertNull(cache.getLatestChecksumInstant(TEST_COLLECTIONID, TEST_PILLAR_2)); + } } @Test @@ -737,36 +786,37 @@ void testGetLatestChecksumDateEntryForCollection() { @Tag("integritytest") void testExtractCollectionFileSize() { addDescription("Tests that the accumulated size of the collection can be extracted"); - IntegrityDAO cache = createDAO(); - - addStep("Insert test data into database", "Data is ingested"); - String file2 = TEST_FILE_ID + "-2"; - String file3 = TEST_FILE_ID + "-3"; - Long size1 = 100L; - Long size2 = 200L; - Long size3 = 300L; - FileIDsData data1 = makeFileIDsDataWithGivenFileSize(TEST_FILE_ID, size1); - FileIDsData data2 = makeFileIDsDataWithGivenFileSize(file2, size2); - FileIDsData data3 = makeFileIDsDataWithGivenFileSize(file3, size3); - cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(data2, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(data2, TEST_PILLAR_2, TEST_COLLECTIONID); - cache.updateFileIDs(data3, TEST_PILLAR_2, TEST_COLLECTIONID); - - long pillar1Size = size1 + size2; - long pillar2Size = size2 + size3; - long collectionSize = size1 + size2 + size3; - - Map metrics = cache.getPillarCollectionMetrics(TEST_COLLECTIONID); - addStep("Check the reported size of the first pillar in the collection", - "The reported size matches the precalculated"); - Assertions.assertEquals(pillar1Size, metrics.get(TEST_PILLAR_1).getPillarCollectionSize()); - addStep("Check the reported size of the second pillar in the collection", - "The reported size matches the precalculated"); - Assertions.assertEquals(pillar2Size, metrics.get(TEST_PILLAR_2).getPillarCollectionSize()); - addStep("Check the reported size of the whole collection", - "The reported size matches the precalculated"); - Assertions.assertEquals(collectionSize, cache.getCollectionSize(TEST_COLLECTIONID)); + try (IntegrityDAO cache = createDAO()) { + + addStep("Insert test data into database", "Data is ingested"); + String file2 = TEST_FILE_ID + "-2"; + String file3 = TEST_FILE_ID + "-3"; + Long size1 = 100L; + Long size2 = 200L; + Long size3 = 300L; + FileIDsData data1 = makeFileIDsDataWithGivenFileSize(TEST_FILE_ID, size1); + FileIDsData data2 = makeFileIDsDataWithGivenFileSize(file2, size2); + FileIDsData data3 = makeFileIDsDataWithGivenFileSize(file3, size3); + cache.updateFileIDs(data1, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(data2, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(data2, TEST_PILLAR_2, TEST_COLLECTIONID); + cache.updateFileIDs(data3, TEST_PILLAR_2, TEST_COLLECTIONID); + + long pillar1Size = size1 + size2; + long pillar2Size = size2 + size3; + long collectionSize = size1 + size2 + size3; + + Map metrics = cache.getPillarCollectionMetrics(TEST_COLLECTIONID); + addStep("Check the reported size of the first pillar in the collection", + "The reported size matches the precalculated"); + Assertions.assertEquals(pillar1Size, metrics.get(TEST_PILLAR_1).getPillarCollectionSize()); + addStep("Check the reported size of the second pillar in the collection", + "The reported size matches the precalculated"); + Assertions.assertEquals(pillar2Size, metrics.get(TEST_PILLAR_2).getPillarCollectionSize()); + addStep("Check the reported size of the whole collection", + "The reported size matches the precalculated"); + Assertions.assertEquals(collectionSize, cache.getCollectionSize(TEST_COLLECTIONID)); + } } @Test @@ -775,21 +825,22 @@ void testExtractCollectionFileSize() { @Tag("integritytest") void testGetFileIDAtIndex() { addDescription("Tests that a fileID at a given index can be extracted."); - IntegrityDAO cache = createDAO(); + try (IntegrityDAO cache = createDAO()) { - addStep("Extract a fileID from the empty database", "Returns a null"); - Assertions.assertNull(cache.getFileIdAtIndex(TEST_COLLECTIONID, 0L)); + addStep("Extract a fileID from the empty database", "Returns a null"); + Assertions.assertNull(cache.getFileIdAtIndex(TEST_COLLECTIONID, 0L)); - addStep("Insert test data into database", "Data is ingested"); - FileIDsData data = makeFileIDsDataWithGivenFileSize(TEST_FILE_ID, 100L); - cache.updateFileIDs(data, TEST_PILLAR_1, TEST_COLLECTIONID); - cache.updateFileIDs(data, TEST_PILLAR_2, TEST_COLLECTIONID); + addStep("Insert test data into database", "Data is ingested"); + FileIDsData data = makeFileIDsDataWithGivenFileSize(TEST_FILE_ID, 100L); + cache.updateFileIDs(data, TEST_PILLAR_1, TEST_COLLECTIONID); + cache.updateFileIDs(data, TEST_PILLAR_2, TEST_COLLECTIONID); - addStep("Extract the first fileID", "The inserted fileID"); - Assertions.assertEquals(TEST_FILE_ID, cache.getFileIdAtIndex(TEST_COLLECTIONID, 0L)); + addStep("Extract the first fileID", "The inserted fileID"); + Assertions.assertEquals(TEST_FILE_ID, cache.getFileIdAtIndex(TEST_COLLECTIONID, 0L)); - addStep("Extract a fileID at an incomprehendable index from the database", "Returns a null"); - Assertions.assertNull(cache.getFileIdAtIndex(TEST_COLLECTIONID, Long.MAX_VALUE)); + addStep("Extract a fileID at an incomprehendable index from the database", "Returns a null"); + Assertions.assertNull(cache.getFileIdAtIndex(TEST_COLLECTIONID, Long.MAX_VALUE)); + } } private FileIDsData makeFileIDsDataWithGivenFileSize(String fileID, Long size) { @@ -835,11 +886,6 @@ private FileIDsData getFileIDsData(String... fileIDs) { return res; } - private IntegrityDAO createDAO() { - DatabaseManager dm = new IntegrityDatabaseManager( - settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - return new DerbyIntegrityDAO(dm.getConnector()); - } /** * This is not the way to handle the iterators, as the lists might grow really long. diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDBToolsTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDBToolsTest.java index 76f30332c..41b1222e0 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDBToolsTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDBToolsTest.java @@ -58,9 +58,7 @@ class IntegrityDBToolsTest extends IntegrityDatabaseTestCase { String testCollectionid; @BeforeEach - @Override public void setup() throws Exception { - super.setup(); testCollectionid = settings.getRepositorySettings().getCollections().getCollection().get(0).getID(); } @@ -92,23 +90,21 @@ protected void customizeSettings() { void testAddCollectionSuccess() { addDescription("Tests that a new collection can be added to the integrity database"); String newCollectionID = "new-collectionid"; - DatabaseManager dm = new IntegrityDatabaseManager( - settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - DBConnector dbCon = new DBConnector(settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - IntegrityDAO integrityDAO = new DerbyIntegrityDAO(dm.getConnector()); - IntegrityDBTools tool = new IntegrityDBTools(dbCon); - List collections = integrityDAO.getCollections(); - addStep("Extract initial list of collections", "The list contains the expected collections"); - assertTrue(collections.contains(testCollectionid)); - assertTrue(collections.contains(extraCollectionId)); - assertFalse(collections.contains(newCollectionID)); - - addStep("Add the new collection", "The new collection is found in the list of collections"); - tool.addCollection(newCollectionID); - collections = integrityDAO.getCollections(); - assertTrue(collections.contains(testCollectionid)); - assertTrue(collections.contains(extraCollectionId)); - assertTrue(collections.contains(newCollectionID)); + try (IntegrityDAO integrityDAO = createDAO(); + IntegrityDBTools tool = new IntegrityDBTools(integrityDAO.getDbConnector())) { + List collections = integrityDAO.getCollections(); + addStep("Extract initial list of collections", "The list contains the expected collections"); + assertTrue(collections.contains(testCollectionid)); + assertTrue(collections.contains(extraCollectionId)); + assertFalse(collections.contains(newCollectionID)); + + addStep("Add the new collection", "The new collection is found in the list of collections"); + tool.addCollection(newCollectionID); + collections = integrityDAO.getCollections(); + assertTrue(collections.contains(testCollectionid)); + assertTrue(collections.contains(extraCollectionId)); + assertTrue(collections.contains(newCollectionID)); + } } @Test @@ -117,28 +113,27 @@ void testAddCollectionSuccess() { @Tag("integritytest") void testAddExistingCollection() { addDescription("Tests that an existing collectionID cannot be added to the integrity database."); - DatabaseManager dm = new IntegrityDatabaseManager( - settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - DBConnector dbCon = new DBConnector(settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - IntegrityDAO integrityDAO = new DerbyIntegrityDAO(dm.getConnector()); - IntegrityDBTools tool = new IntegrityDBTools(dbCon); - List collections = integrityDAO.getCollections(); - addStep("Extract initial list of collections.", - "The list contains the expected collections."); - assertTrue(collections.contains(testCollectionid)); - assertTrue(collections.contains(extraCollectionId)); - - addStep("Attempt to add the new collection.", - "An exception is thrown, and the collection list is uneffected."); - try { - tool.addCollection(testCollectionid); - fail("addCollection did not fail as expected"); - } catch (IntegrityDBStateException e) { + try (IntegrityDAO integrityDAO = createDAO(); + IntegrityDBTools tool = new IntegrityDBTools(integrityDAO.getDbConnector())) { + List collections = integrityDAO.getCollections(); + addStep("Extract initial list of collections.", + "The list contains the expected collections."); + assertTrue(collections.contains(testCollectionid)); + assertTrue(collections.contains(extraCollectionId)); + + addStep("Attempt to add the new collection.", + "An exception is thrown, and the collection list is uneffected."); + try { + tool.addCollection(testCollectionid); + fail("addCollection did not fail as expected"); + } catch (IntegrityDBStateException e) { + + } + collections = integrityDAO.getCollections(); + assertTrue(collections.contains(testCollectionid)); + assertTrue(collections.contains(extraCollectionId)); } - collections = integrityDAO.getCollections(); - assertTrue(collections.contains(testCollectionid)); - assertTrue(collections.contains(extraCollectionId)); } @Test @@ -148,29 +143,28 @@ void testAddExistingCollection() { void testRemoveNonExistingCollection() { addDescription("Tests that a non existing collection can't be removed from the integrity database."); String nonExistingCollectionID = "non-existing-collectionid"; - DatabaseManager dm = new IntegrityDatabaseManager( - settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - DBConnector dbCon = new DBConnector(settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - IntegrityDAO integrityDAO = new DerbyIntegrityDAO(dm.getConnector()); - IntegrityDBTools tool = new IntegrityDBTools(dbCon); - List collections = integrityDAO.getCollections(); - addStep("Extract initial list of collections.", - "The list contains the expected collections."); - assertTrue(collections.contains(testCollectionid)); - assertTrue(collections.contains(extraCollectionId)); - assertFalse(collections.contains(nonExistingCollectionID)); - - addStep("Attempt to remove the non-existing collection.", - "An exception is thrown, the collection list is uneffected."); - try { - tool.removeCollection(nonExistingCollectionID); - fail("removeCollection did not fail as expected"); - } catch (IntegrityDBStateException e) { + try (IntegrityDAO integrityDAO = createDAO(); + IntegrityDBTools tool = new IntegrityDBTools(integrityDAO.getDbConnector())) { + List collections = integrityDAO.getCollections(); + addStep("Extract initial list of collections.", + "The list contains the expected collections."); + assertTrue(collections.contains(testCollectionid)); + assertTrue(collections.contains(extraCollectionId)); + assertFalse(collections.contains(nonExistingCollectionID)); + + addStep("Attempt to remove the non-existing collection.", + "An exception is thrown, the collection list is uneffected."); + try { + tool.removeCollection(nonExistingCollectionID); + fail("removeCollection did not fail as expected"); + } catch (IntegrityDBStateException e) { + + } + collections = integrityDAO.getCollections(); + assertTrue(collections.contains(testCollectionid)); + assertTrue(collections.contains(extraCollectionId)); } - collections = integrityDAO.getCollections(); - assertTrue(collections.contains(testCollectionid)); - assertTrue(collections.contains(extraCollectionId)); } private void populateCollection(IntegrityDAO dao, String collectionID) { diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDatabaseTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDatabaseTest.java index 6cb75040f..eec45d8be 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDatabaseTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/cache/IntegrityDatabaseTest.java @@ -62,9 +62,7 @@ class IntegrityDatabaseTest extends IntegrityDatabaseTestCase { String TEST_COLLECTIONID; @BeforeEach - @Override public void setup() throws Exception { - super.setup(); TEST_COLLECTIONID = settings.getRepositorySettings().getCollections().getCollection().get(0).getID(); auditManager = Mockito.mock(AuditTrailManager.class); } diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/integrationtest/MissingChecksumTests.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/integrationtest/MissingChecksumTests.java index f5411dbd9..d639ee2eb 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/integrationtest/MissingChecksumTests.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/integrationtest/MissingChecksumTests.java @@ -52,14 +52,22 @@ import org.bitrepository.integrityservice.workflow.step.FullUpdateChecksumsStep; import org.bitrepository.integrityservice.workflow.step.HandleMissingChecksumsStep; import org.bitrepository.integrityservice.workflow.step.UpdateChecksumsStep; -import org.bitrepository.service.database.DerbyDatabaseDestroyer; +import org.bitrepository.pillar.integration.PostgresFixedPortContainer; +import org.bitrepository.service.database.DBConnector; +import org.bitrepository.service.database.DatabaseUtils; import org.bitrepository.service.exception.WorkflowAbortedException; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import org.testcontainers.containers.InternetProtocol; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; @@ -75,6 +83,8 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@Testcontainers class MissingChecksumTests { private static final String PILLAR_1 = "pillar1"; private static final String PILLAR_2 = "pillar2"; @@ -90,24 +100,36 @@ class MissingChecksumTests { protected IntegrityContributors integrityContributors; IntegrityReporter reporter; - - @BeforeEach - void setup() throws Exception { + @Container + static PostgreSQLContainer postgreSQLContainer = new PostgresFixedPortContainer("postgres:18-alpine") + .withFixedExposedPort(9876, 5432, InternetProtocol.TCP) + .withDatabaseName("integrityDB") + .withUsername("testcontainerUser") + .withPassword("testcontainerPassword") + .withLabel("purpose","integrityDB"); + + @BeforeAll + public void beforeAll() throws Exception { settings = TestSettingsProvider.reloadSettings("IntegrityCheckingUnderTest"); + SettingsUtils.initialize(settings); + IntegrityDatabaseCreator integrityDatabaseCreator = new IntegrityDatabaseCreator(); + integrityDatabaseCreator.createIntegrityDatabase(settings, "sql/postgres/integrityDBCreation.sql", "sql/postgres/integrityDB7to8migration.sql"); - DerbyDatabaseDestroyer.deleteDatabase( - settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); + } + @BeforeEach + public void beforeEach() throws Exception { + clearDatabase(); IntegrityDatabaseCreator integrityDatabaseCreator = new IntegrityDatabaseCreator(); - integrityDatabaseCreator.createIntegrityDatabase(settings, null); + integrityDatabaseCreator.createIntegrityDatabase(settings, "sql/postgres/integrityDBCreation.sql", "sql/postgres/integrityDB7to8migration.sql"); - settings.getRepositorySettings().getCollections().getCollection().get(0).getPillarIDs().getPillarID().clear(); - settings.getRepositorySettings().getCollections().getCollection().get(0).getPillarIDs().getPillarID().add(PILLAR_1); - settings.getRepositorySettings().getCollections().getCollection().get(0).getPillarIDs().getPillarID().add(PILLAR_2); + settings.getRepositorySettings().getCollections().getCollection().getFirst().getPillarIDs().getPillarID().clear(); + settings.getRepositorySettings().getCollections().getCollection().getFirst().getPillarIDs().getPillarID().add(PILLAR_1); + settings.getRepositorySettings().getCollections().getCollection().getFirst().getPillarIDs().getPillarID().add(PILLAR_2); Duration time = DatatypeFactory.newInstance().newDuration(0); settings.getReferenceSettings().getIntegrityServiceSettings().setTimeBeforeMissingFileCheck(time); - TEST_COLLECTION = settings.getRepositorySettings().getCollections().getCollection().get(0).getID(); + TEST_COLLECTION = settings.getRepositorySettings().getCollections().getCollection().getFirst().getID(); SettingsUtils.initialize(settings); collector = Mockito.mock(IntegrityInformationCollector.class); @@ -120,6 +142,19 @@ void setup() throws Exception { SettingsUtils.initialize(settings); } + public void clearDatabase() { + DBConnector connector = new DBConnector(settings.getReferenceSettings() + .getIntegrityServiceSettings() + .getIntegrityDatabase()); + DatabaseUtils.executeStatement(connector, "DELETE FROM fileinfo"); + DatabaseUtils.executeStatement(connector, "DELETE FROM collection_progress"); + DatabaseUtils.executeStatement(connector, "DELETE FROM pillarstats"); + DatabaseUtils.executeStatement(connector, "DELETE FROM collectionstats"); + DatabaseUtils.executeStatement(connector, "DELETE FROM stats"); + DatabaseUtils.executeStatement(connector, "DELETE FROM pillar"); + DatabaseUtils.executeStatement(connector, "DELETE FROM collections"); + } + @Test @Tag("regressiontest") @Tag("integritytest") @@ -186,7 +221,7 @@ void testMissingChecksumForFirstGetChecksums() throws WorkflowAbortedException { List missingChecksumsPillar2 = getIssuesFromIterator(model.findFilesWithMissingChecksum(TEST_COLLECTION, PILLAR_2, testStart)); Assertions.assertEquals(1, missingChecksumsPillar2.size()); - Assertions.assertEquals(TEST_FILE_1, missingChecksumsPillar2.get(0)); + Assertions.assertEquals(TEST_FILE_1, missingChecksumsPillar2.getFirst()); } @Test @@ -286,7 +321,7 @@ protected void populateDatabase(IntegrityModel model, String... files) { items.getFileIDsDataItem().add(item); } data.setFileIDsDataItems(items); - String collectionID = settings.getRepositorySettings().getCollections().getCollection().get(0).getID(); + String collectionID = settings.getRepositorySettings().getCollections().getCollection().getFirst().getID(); model.addFileIDs(data, PILLAR_1, collectionID); model.addFileIDs(data, PILLAR_2, collectionID); } diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/reports/BasicIntegrityReporterTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/reports/BasicIntegrityReporterIT.java similarity index 99% rename from bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/reports/BasicIntegrityReporterTest.java rename to bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/reports/BasicIntegrityReporterIT.java index 8aaac8070..24854928b 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/reports/BasicIntegrityReporterTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/reports/BasicIntegrityReporterIT.java @@ -35,7 +35,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -public class BasicIntegrityReporterTest extends IntegrationTest { +public class BasicIntegrityReporterIT extends IntegrationTest { private static final String REPORT_SUMMARY_START = "The following integrity issues were found:\n"; @Test diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/stresstest/DatabaseStressTests.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/stresstest/DatabaseStressTests.java index 079a307dd..0f770d5c6 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/stresstest/DatabaseStressTests.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/stresstest/DatabaseStressTests.java @@ -27,20 +27,26 @@ import org.bitrepository.common.settings.Settings; import org.bitrepository.common.settings.TestSettingsProvider; import org.bitrepository.common.utils.CalendarUtils; +import org.bitrepository.common.utils.SettingsUtils; import org.bitrepository.common.utils.TimeUtils; import org.bitrepository.integrityservice.cache.IntegrityDatabaseManager; -import org.bitrepository.integrityservice.cache.database.DerbyIntegrityDAO; import org.bitrepository.integrityservice.cache.database.IntegrityDAO; import org.bitrepository.integrityservice.cache.database.IntegrityDatabaseCreator; +import org.bitrepository.integrityservice.cache.database.PostgresIntegrityDAO; +import org.bitrepository.pillar.integration.PostgresFixedPortContainer; import org.bitrepository.service.database.DBConnector; import org.bitrepository.service.database.DatabaseManager; import org.bitrepository.service.database.DatabaseUtils; -import org.bitrepository.service.database.DerbyDatabaseDestroyer; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.testcontainers.containers.InternetProtocol; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; @@ -50,6 +56,8 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@Testcontainers class DatabaseStressTests { private static final String PILLAR_1 = "pillar1"; @@ -61,15 +69,28 @@ class DatabaseStressTests { protected Settings settings; - @BeforeEach - void setup() throws Exception { + @Container + static PostgreSQLContainer postgreSQLContainer = new PostgresFixedPortContainer("postgres:18-alpine") + .withFixedExposedPort(9876, 5432, InternetProtocol.TCP) + .withDatabaseName("integrityDB") + .withUsername("testcontainerUser") + .withPassword("testcontainerPassword") + .withLabel("purpose","integrityDB"); + + @BeforeAll + public void beforeAll() throws Exception { settings = TestSettingsProvider.reloadSettings("IntegrityCheckingUnderTest"); + SettingsUtils.initialize(settings); + IntegrityDatabaseCreator integrityDatabaseCreator = new IntegrityDatabaseCreator(); + integrityDatabaseCreator.createIntegrityDatabase(settings, "sql/postgres/integrityDBCreation.sql", "sql/postgres/integrityDB7to8migration.sql"); - DerbyDatabaseDestroyer.deleteDatabase( - settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); + } + @BeforeEach + public void beforeEach() throws Exception { + clearDatabase(); IntegrityDatabaseCreator integrityDatabaseCreator = new IntegrityDatabaseCreator(); - integrityDatabaseCreator.createIntegrityDatabase(settings, null); + integrityDatabaseCreator.createIntegrityDatabase(settings, "sql/postgres/integrityDBCreation.sql", "sql/postgres/integrityDB7to8migration.sql"); settings.getRepositorySettings().getCollections().getCollection().get(0).getPillarIDs().getPillarID().clear(); settings.getRepositorySettings().getCollections().getCollection().get(0).getPillarIDs().getPillarID().add(PILLAR_1); @@ -79,6 +100,20 @@ void setup() throws Exception { Duration time = DatatypeFactory.newInstance().newDuration(0); settings.getReferenceSettings().getIntegrityServiceSettings().setTimeBeforeMissingFileCheck(time); + SettingsUtils.initialize(settings); + + } + public void clearDatabase() { + DBConnector connector = new DBConnector(settings.getReferenceSettings() + .getIntegrityServiceSettings() + .getIntegrityDatabase()); + DatabaseUtils.executeStatement(connector, "DELETE FROM fileinfo"); + DatabaseUtils.executeStatement(connector, "DELETE FROM collection_progress"); + DatabaseUtils.executeStatement(connector, "DELETE FROM pillarstats"); + DatabaseUtils.executeStatement(connector, "DELETE FROM collectionstats"); + DatabaseUtils.executeStatement(connector, "DELETE FROM stats"); + DatabaseUtils.executeStatement(connector, "DELETE FROM pillar"); + DatabaseUtils.executeStatement(connector, "DELETE FROM collections"); } protected void populateDatabase(IntegrityDAO cache) { @@ -100,14 +135,6 @@ protected void populateDatabase(IntegrityDAO cache) { cache.updateFileIDs(data, PILLAR_4, collectionID); } - @AfterEach - void clearDatabase() { - DBConnector connector = - new DBConnector(settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - DatabaseUtils.executeStatement(connector, "DELETE FROM fileinfo"); - DatabaseUtils.executeStatement(connector, "DELETE FROM pillar"); - } - @Test @Tag("stresstest") @Tag("integritytest") @@ -137,7 +164,7 @@ void testDatabasePerformance() { private IntegrityDAO createDAO() { DatabaseManager dm = new IntegrityDatabaseManager( settings.getReferenceSettings().getIntegrityServiceSettings().getIntegrityDatabase()); - return new DerbyIntegrityDAO(dm.getConnector()); + return new PostgresIntegrityDAO(dm.getConnector()); } } diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/RepairMissingFilesWorkflowTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/RepairMissingFilesWorkflowTest.java index 290b0d6e2..b27fdefe4 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/RepairMissingFilesWorkflowTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/RepairMissingFilesWorkflowTest.java @@ -199,7 +199,7 @@ void testFailedGetFile() { doAnswer(new Answer() { public Void answer(InvocationOnMock invocation) { EventHandler eventHandler = (EventHandler) invocation.getArguments()[3]; - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "failure", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "failure")); return null; } }).when(collector).getFile( @@ -252,7 +252,7 @@ public Void answer(InvocationOnMock invocation) { doAnswer(new Answer() { public Void answer(InvocationOnMock invocation) { EventHandler eventHandler = (EventHandler) invocation.getArguments()[4]; - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "failure", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "failure")); return null; } }).when(collector).putFile( diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflowTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflowTest.java index fb7317ddf..0345116d4 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflowTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflowTest.java @@ -182,7 +182,9 @@ void testOneComponentFailureAndTwoOtherAgreeOnChecksum() { eventHandler.handleEvent(e1); eventHandler.handleEvent(e2); eventHandler.handleEvent(e3); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "COMPONENT FAILED", Arrays.asList(e1, e2, e3))); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, + Arrays.asList(e1, e2, e3), + "COMPONENT FAILED")); return null; }).when(collector).getChecksums(anyString(), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); @@ -228,8 +230,10 @@ void testOneComponentFailureAndTwoOtherDisagreeOnChecksum() throws Exception { eventHandler.handleEvent(e1); eventHandler.handleEvent(e2); eventHandler.handleEvent(e3); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "COMPONENT FAILED", - Arrays.asList(e1, e2, e3))); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, + Arrays.asList(e1, e2, e3), + "COMPONENT FAILED" + )); return null; }).when(collector).getChecksums(anyString(), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); @@ -312,7 +316,7 @@ void testNoReceivedChecksums() { doAnswer((Answer) invocation -> { EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "")); return null; }).when(collector).getChecksums(anyString(), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/GetChecksumForFileStepTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/GetChecksumForFileStepTest.java index 8d9a95637..dc3a91ef3 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/GetChecksumForFileStepTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/GetChecksumForFileStepTest.java @@ -187,7 +187,7 @@ void testComponentFailure() throws Exception { eventHandler.handleEvent(e2); eventHandler.handleEvent(e3); eventHandler.handleEvent( - new OperationFailedEvent(TEST_COLLECTION, "COMPONENT FAILED", Arrays.asList(e1, e2, e3))); + new OperationFailedEvent(TEST_COLLECTION, Arrays.asList(e1, e2, e3), "COMPONENT FAILED")); return null; }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), anyString(), diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/GetFileStepTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/GetFileStepTest.java index 918630262..ac48a5fd4 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/GetFileStepTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/GetFileStepTest.java @@ -80,7 +80,7 @@ void testNegativeReply() throws Exception { doAnswer(new Answer() { public Void answer(InvocationOnMock invocation) { EventHandler eventHandler = (EventHandler) invocation.getArguments()[3]; - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "Problem encountered", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "Problem encountered")); return null; } }).when(collector).getFile( diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/PutFileStepTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/PutFileStepTest.java index 7c31b30b6..8d137bdf0 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/PutFileStepTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/PutFileStepTest.java @@ -84,7 +84,7 @@ void testNegativeReply() throws Exception { doAnswer(new Answer() { public Void answer(InvocationOnMock invocation) { EventHandler eventHandler = (EventHandler) invocation.getArguments()[4]; - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "Problem encountered", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "Problem encountered")); return null; } }).when(collector).putFile( diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/UpdateChecksumsStepTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/UpdateChecksumsStepTest.java index 1383c5827..9a70c4a56 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/UpdateChecksumsStepTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/UpdateChecksumsStepTest.java @@ -52,9 +52,11 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; +import static org.mockito.AdditionalMatchers.or; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -71,12 +73,10 @@ public class UpdateChecksumsStepTest extends WorkflowstepTest { @Tag("regressiontest") void testPositiveReply() throws WorkflowAbortedException { addDescription("Test the step for updating the checksums can handle COMPLETE operation event."); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); - return null; - } + doAnswer(invocation -> { + EventHandler eventHandler = invocation.getArgument(6, EventHandler.class); + eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); + return null; }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), any(), anyString(), any(ContributorQuery[].class), any(EventHandler.class)); @@ -96,14 +96,12 @@ public Void answer(InvocationOnMock invocation) { @Tag("regressiontest") void testAbortWorkflowWhenNegativeReply() { addDescription("Test the step for updating the checksums will abort the workflow in case " - + "of FAILURE operation event and AbortOnFailedContributor = true ."); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - eventHandler.handleEvent(new ContributorFailedEvent(TEST_PILLAR_1, TEST_COLLECTION, ResponseCode.FAILURE)); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "Problem encountered", null)); - return null; - } + + "of FAILURE operation event and AbortOnFailedContributor = true ."); + doAnswer(invocation -> { + EventHandler eventHandler = invocation.getArgument(6, EventHandler.class); + eventHandler.handleEvent(new ContributorFailedEvent(TEST_PILLAR_1, TEST_COLLECTION, ResponseCode.FAILURE)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "Problem encountered")); + return null; }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), any(), anyString(), any(ContributorQuery[].class), any(EventHandler.class)); @@ -138,11 +136,11 @@ void testRetryCollectionWhenNegativeReply() throws WorkflowAbortedException { boolean firstAnswer = true; public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; + EventHandler eventHandler = invocation.getArgument(6, EventHandler.class); if (firstAnswer) { firstAnswer = false; eventHandler.handleEvent(new ContributorFailedEvent(TEST_PILLAR_1, TEST_COLLECTION, ResponseCode.FAILURE)); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "Problem encountered", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "Problem encountered")); } else { eventHandler.handleEvent(new IdentificationCompleteEvent(TEST_COLLECTION, List.of(TEST_PILLAR_1))); eventHandler.handleEvent(new ChecksumsCompletePillarEvent(TEST_PILLAR_1, TEST_COLLECTION, @@ -180,9 +178,9 @@ void testContinueWorkflowNegativeReply() throws WorkflowAbortedException { + "of FAILURE operation event and AbortOnFailedContributor = false ."); doAnswer(new Answer() { public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; + EventHandler eventHandler = invocation.getArgument(6, EventHandler.class); eventHandler.handleEvent(new ContributorFailedEvent(TEST_PILLAR_1, TEST_COLLECTION, ResponseCode.FAILURE)); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "Problem encountered", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "Problem encountered")); return null; } }).when(collector).getChecksums( @@ -210,15 +208,13 @@ public Void answer(InvocationOnMock invocation) { void testIngestOfResults() throws WorkflowAbortedException { addDescription("Test the step for updating the checksums delivers the results to the integrity model."); final ResultingChecksums resultingChecksums = createResultingChecksums(DEFAULT_CHECKSUM, TEST_FILE_1); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - eventHandler.handleEvent(new IdentificationCompleteEvent(TEST_COLLECTION, List.of(TEST_PILLAR_1))); - eventHandler.handleEvent(new ChecksumsCompletePillarEvent(TEST_PILLAR_1, TEST_COLLECTION, - resultingChecksums, createChecksumSpecTYPE(), false)); - eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); - return null; - } + doAnswer(invocation -> { + EventHandler eventHandler = invocation.getArgument(6, EventHandler.class); + eventHandler.handleEvent(new IdentificationCompleteEvent(TEST_COLLECTION, List.of(TEST_PILLAR_1))); + eventHandler.handleEvent(new ChecksumsCompletePillarEvent(TEST_PILLAR_1, TEST_COLLECTION, + resultingChecksums, createChecksumSpecTYPE(), false)); + eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); + return null; }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), any(), anyString(), any(ContributorQuery[].class), any(EventHandler.class)); @@ -242,15 +238,13 @@ public Void answer(InvocationOnMock invocation) { void testCallForChangingChecksumStates() throws WorkflowAbortedException { addDescription("Test the step for updating the checksums delivers the results to the integrity model."); final ResultingChecksums resultingChecksums = createResultingChecksums(DEFAULT_CHECKSUM, TEST_FILE_1); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - eventHandler.handleEvent(new IdentificationCompleteEvent(TEST_COLLECTION, List.of(TEST_PILLAR_1))); - eventHandler.handleEvent(new ChecksumsCompletePillarEvent(TEST_PILLAR_1, TEST_COLLECTION, - resultingChecksums, createChecksumSpecTYPE(), false)); - eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); - return null; - } + doAnswer(invocation -> { + EventHandler eventHandler = invocation.getArgument(6, EventHandler.class); + eventHandler.handleEvent(new IdentificationCompleteEvent(TEST_COLLECTION, List.of(TEST_PILLAR_1))); + eventHandler.handleEvent(new ChecksumsCompletePillarEvent(TEST_PILLAR_1, TEST_COLLECTION, + resultingChecksums, createChecksumSpecTYPE(), false)); + eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); + return null; }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), any(), anyString(), any(ContributorQuery[].class), any(EventHandler.class)); @@ -313,17 +307,14 @@ public Void answer(InvocationOnMock invocation) { void testFullChecksumCollection() throws WorkflowAbortedException { addDescription("Test that the full list of checksums is requested."); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); - return null; - } + doAnswer(invocation -> { + invocation.getArgument(6, EventHandler.class).handleEvent(new CompleteEvent(TEST_COLLECTION, null)); + return null; }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), any(), anyString(), any(ContributorQuery[].class), any(EventHandler.class)); - when(model.getDateForNewestChecksumEntryForPillarInstant(anyString(), anyString())).thenReturn(Instant.EPOCH); + when(model.getDateForNewestChecksumEntryForPillarInstant(anyString(), anyString())).thenReturn(Instant.MIN); when(integrityContributors.getActiveContributors()) .thenReturn(new HashSet<>(List.of(TEST_PILLAR_1))).thenReturn(new HashSet<>()); @@ -332,10 +323,10 @@ public Void answer(InvocationOnMock invocation) { step.performStep(); ContributorQuery[] expectedContributorQueries = - makeFullQueries(settings.getRepositorySettings().getCollections().getCollection().get(0).getPillarIDs().getPillarID()); + makeFullQueries(settings.getRepositorySettings().getCollections().getCollection().getFirst().getPillarIDs().getPillarID()); verify(collector).getChecksums(eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), - any(), anyString(), eq(expectedContributorQueries), any(EventHandler.class)); + any(), or(anyString(),isNull()), eq(expectedContributorQueries), any(EventHandler.class)); verifyNoMoreInteractions(alerter); } @@ -344,12 +335,10 @@ public Void answer(InvocationOnMock invocation) { void testIncrementalChecksumCollection() throws WorkflowAbortedException { addDescription("Test that only the list of new checksums is requested."); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); - return null; - } + doAnswer(invocation -> { + EventHandler eventHandler = invocation.getArgument(6, EventHandler.class); + eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); + return null; }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), any(), anyString(), any(ContributorQuery[].class), any(EventHandler.class)); @@ -372,7 +361,7 @@ public Void answer(InvocationOnMock invocation) { private ContributorQuery[] makeFullQueries(List pillars) { List res = new ArrayList<>(); for (String pillar : pillars) { - Instant latestChecksumDate = null; + Instant latestChecksumDate = Instant.MIN; res.add(new ContributorQuery(pillar, latestChecksumDate, null, SettingsUtils.DEFAULT_MAX_CLIENT_PAGE_SIZE)); } @@ -390,15 +379,15 @@ private ContributorQuery[] makeQueries(List pillars, IntegrityModel stor } - private ResultingChecksums createResultingChecksums(String checksum, String... fileids) { + private ResultingChecksums createResultingChecksums(String checksum, String... fileIDs) { ResultingChecksums res = new ResultingChecksums(); - res.getChecksumDataItems().addAll(createChecksumData(checksum, fileids)); + res.getChecksumDataItems().addAll(createChecksumData(checksum, fileIDs)); return res; } - private List createChecksumData(String checksum, String... fileids) { + private List createChecksumData(String checksum, String... fileIDs) { List res = new ArrayList<>(); - for (String fileID : fileids) { + for (String fileID : fileIDs) { ChecksumDataForChecksumSpecTYPE csData = new ChecksumDataForChecksumSpecTYPE(); csData.setCalculationTimestamp(CalendarUtils.getXmlGregorianCalendar(Instant.now())); try { diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/UpdateFileIDsStepTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/UpdateFileIDsStepTest.java index 908829009..47110bcfb 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/UpdateFileIDsStepTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/UpdateFileIDsStepTest.java @@ -96,7 +96,7 @@ void testAbortWorkflowWhenNegativeReply() { public Void answer(InvocationOnMock invocation) { EventHandler eventHandler = (EventHandler) invocation.getArguments()[4]; eventHandler.handleEvent(new ContributorFailedEvent(TEST_PILLAR_1, TEST_COLLECTION, ResponseCode.FAILURE)); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "Operation failed", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "Operation failed")); return null; } }).when(collector).getFileIDs( @@ -138,7 +138,7 @@ public Void answer(InvocationOnMock invocation) { if(firstAnswer) { firstAnswer = false; eventHandler.handleEvent(new ContributorFailedEvent(TEST_PILLAR_1, TEST_COLLECTION, ResponseCode.FAILURE)); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "Operation failed", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "Operation failed")); } else { eventHandler.handleEvent(new IdentificationCompleteEvent(TEST_COLLECTION, List.of(TEST_PILLAR_1))); eventHandler.handleEvent(new FileIDsCompletePillarEvent( @@ -180,7 +180,7 @@ void testContinueWorkflowWhenNegativeReply() throws WorkflowAbortedException { public Void answer(InvocationOnMock invocation) { EventHandler eventHandler = (EventHandler) invocation.getArguments()[4]; eventHandler.handleEvent(new ContributorFailedEvent(TEST_PILLAR_1, TEST_COLLECTION, ResponseCode.FAILURE)); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "Operation failed", null)); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, null, "Operation failed")); return null; } }).when(collector).getFileIDs( diff --git a/bitrepository-integrity-service/src/test/resources/scripts/create_test_databases.sh b/bitrepository-integrity-service/src/test/resources/scripts/create_test_databases.sh deleted file mode 100644 index 081ee791c..000000000 --- a/bitrepository-integrity-service/src/test/resources/scripts/create_test_databases.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -### -# #%L -# Bitrepository Integrity Service -# %% -# Copyright (C) 2010 - 2013 The State and University Library, The Royal Library and The State Archives, Denmark -# %% -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as -# published by the Free Software Foundation, either version 2.1 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Lesser Public License for more details. -# -# You should have received a copy of the GNU General Lesser Public -# License along with this program. If not, see -# . -# #L% -### - -# Creates the component-test database. Requires that the package phase has finished as the war files content are used. - -cd target -tar -xf *-distribution.tar.gz -cd ${artifactId}-${version} -bin/create_derby_databases.sh diff --git a/bitrepository-monitoring-service/pom.xml b/bitrepository-monitoring-service/pom.xml index 93309d7ba..6fbb1cafa 100644 --- a/bitrepository-monitoring-service/pom.xml +++ b/bitrepository-monitoring-service/pom.xml @@ -28,39 +28,27 @@ org.apache.cxf cxf-rt-transports-http - ${cxf.version} org.apache.cxf cxf-rt-rs-client - ${cxf.version} com.fasterxml.jackson.core jackson-databind - ${jackson.version} - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson.version} + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider jakarta.ws.rs jakarta.ws.rs-api - ${jakarta.ws.rs.version} - javax - javaee-web-api - ${javaee.web.version} - provided - - - javax.servlet - javax.servlet-api - ${javax.servlet.version} + jakarta.servlet + jakarta.servlet-api provided @@ -79,9 +67,8 @@ test - org.apache.activemq + org.apache.artemis artemis-server - ${artemis.version} test @@ -91,11 +78,6 @@ io.qameta.allure allure-maven - 2.12.0 - - ${project.basedir}/allure-results - ${project.basedir}/allure-report - maven-assembly-plugin diff --git a/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/MonitoringServiceRestApplication.java b/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/MonitoringServiceRestApplication.java index c62829d9e..a40f24f06 100644 --- a/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/MonitoringServiceRestApplication.java +++ b/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/MonitoringServiceRestApplication.java @@ -1,8 +1,9 @@ package org.bitrepository.monitoringservice.webservice; -import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; -import javax.ws.rs.core.Application; +import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider; +import jakarta.ws.rs.core.Application; + import java.util.Arrays; import java.util.HashSet; import java.util.Set; diff --git a/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/RestMonitoringService.java b/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/RestMonitoringService.java index 4d78f8c0a..4e27dc57c 100644 --- a/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/RestMonitoringService.java +++ b/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/RestMonitoringService.java @@ -21,14 +21,14 @@ */ package org.bitrepository.monitoringservice.webservice; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; import org.bitrepository.common.utils.TimeUtils; import org.bitrepository.monitoringservice.MonitoringService; import org.bitrepository.monitoringservice.MonitoringServiceFactory; import org.bitrepository.monitoringservice.status.ComponentStatus; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; import java.util.ArrayList; import java.util.List; import java.util.Map; diff --git a/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/WebConfOption.java b/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/WebConfOption.java index cd66bb711..ee6ab6484 100644 --- a/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/WebConfOption.java +++ b/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/WebConfOption.java @@ -21,8 +21,8 @@ */ package org.bitrepository.monitoringservice.webservice; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class WebConfOption { diff --git a/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/WebStatus.java b/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/WebStatus.java index 05ca16a0f..7e4c65afe 100644 --- a/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/WebStatus.java +++ b/bitrepository-monitoring-service/src/main/java/org/bitrepository/monitoringservice/webservice/WebStatus.java @@ -21,11 +21,11 @@ */ package org.bitrepository.monitoringservice.webservice; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; import org.bitrepository.common.utils.TimeUtils; import org.bitrepository.monitoringservice.status.ComponentStatus; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; import java.time.Instant; @XmlRootElement diff --git a/bitrepository-monitoring-service/src/main/webapp/WEB-INF/web.xml b/bitrepository-monitoring-service/src/main/webapp/WEB-INF/web.xml index 7940ce3f8..e8a45309f 100644 --- a/bitrepository-monitoring-service/src/main/webapp/WEB-INF/web.xml +++ b/bitrepository-monitoring-service/src/main/webapp/WEB-INF/web.xml @@ -34,7 +34,7 @@ Monitoring-service org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet - javax.ws.rs.Application + jakarta.ws.rs.Application org.bitrepository.monitoringservice.webservice.MonitoringServiceRestApplication diff --git a/bitrepository-monitoring-service/src/test/java/org/bitrepository/monitoringservice/alarm/MonitorAlerterTest.java b/bitrepository-monitoring-service/src/test/java/org/bitrepository/monitoringservice/alarm/MonitorAlerterIT.java similarity index 98% rename from bitrepository-monitoring-service/src/test/java/org/bitrepository/monitoringservice/alarm/MonitorAlerterTest.java rename to bitrepository-monitoring-service/src/test/java/org/bitrepository/monitoringservice/alarm/MonitorAlerterIT.java index 8210501c5..179c21b0a 100644 --- a/bitrepository-monitoring-service/src/test/java/org/bitrepository/monitoringservice/alarm/MonitorAlerterTest.java +++ b/bitrepository-monitoring-service/src/test/java/org/bitrepository/monitoringservice/alarm/MonitorAlerterIT.java @@ -45,7 +45,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -public class MonitorAlerterTest extends IntegrationTest { +public class MonitorAlerterIT extends IntegrationTest { @Test @Tag("regressiontest") diff --git a/bitrepository-monitoring-service/src/test/java/org/bitrepository/monitoringservice/collector/StatusEventHandlerTest.java b/bitrepository-monitoring-service/src/test/java/org/bitrepository/monitoringservice/collector/StatusEventHandlerTest.java index ee37bca1b..9e71c3ab0 100644 --- a/bitrepository-monitoring-service/src/test/java/org/bitrepository/monitoringservice/collector/StatusEventHandlerTest.java +++ b/bitrepository-monitoring-service/src/test/java/org/bitrepository/monitoringservice/collector/StatusEventHandlerTest.java @@ -57,8 +57,7 @@ void testStatusEventHandler() throws Exception { Assertions.assertEquals(0, alerter.getCallsForCheckStatuses()); addStep("Test an unhandled event.", "Should not make any calls."); - AbstractOperationEvent event = new DefaultEvent(TEST_COLLECTION); - event.setEventType(OperationEvent.OperationEventType.WARNING); + AbstractOperationEvent event = new DefaultEvent(OperationEvent.OperationEventType.WARNING, TEST_COLLECTION); eventHandler.handleEvent(event); Assertions.assertEquals(0, store.getCallsForGetStatusMap()); @@ -75,7 +74,7 @@ void testStatusEventHandler() throws Exception { Assertions.assertEquals(1, alerter.getCallsForCheckStatuses()); addStep("Test the Failed event", "Should make another call to the alerter"); - event = new OperationFailedEvent(null, "info", null); + event = new OperationFailedEvent(null, null, "info"); eventHandler.handleEvent(event); Assertions.assertEquals(0, store.getCallsForGetStatusMap()); Assertions.assertEquals(0, store.getCallsForUpdateReplayCounts()); diff --git a/bitrepository-reference-pillar/pom.xml b/bitrepository-reference-pillar/pom.xml index 31f4fd306..3548c4330 100644 --- a/bitrepository-reference-pillar/pom.xml +++ b/bitrepository-reference-pillar/pom.xml @@ -51,9 +51,23 @@ test - org.apache.activemq + org.apache.artemis artemis-server - ${artemis.version} + test + + + org.testcontainers + testcontainers-junit-jupiter + test + + + org.testcontainers + testcontainers-activemq + test + + + org.testcontainers + testcontainers-postgresql test @@ -92,11 +106,6 @@ io.qameta.allure allure-maven - 2.12.0 - - ${project.basedir}/allure-results - ${project.basedir}/allure-report - org.apache.maven.plugins @@ -135,6 +144,16 @@ + + maven-failsafe-plugin + + + org.bitrepository.pillar.integration.** + + org.bitrepository.pillar.BitrepositoryPillarCommonIntegrationTestSuite + true + + @@ -168,23 +187,63 @@ - integration-test maven-failsafe-plugin - - BitrepositoryPillarTestSuite - BitrepositoryChecksumPillarTestSuite - true - + BitrepositoryPillarTestSuite + integration-test + + integration-test + verify + + + org.bitrepository.pillar.integration.BitrepositoryPillarTestSuite + true + + + + BitrepositoryChecksumPillarTestSuite + integration-test + + integration-test + verify + + + org.bitrepository.pillar.integration.BitrepositoryChecksumPillarTestSuite + + true + + + + + + + + + Stress-test + + + + maven-failsafe-plugin + + + stressTest + integration-test integration-test verify + + org.bitrepository.pillar.integration.BitrepositoryPerformanceTestSuite + true + + true + + diff --git a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetChecksumsRequestHandler.java b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetChecksumsRequestHandler.java index 96f093474..2b644c372 100644 --- a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetChecksumsRequestHandler.java +++ b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetChecksumsRequestHandler.java @@ -24,7 +24,7 @@ */ package org.bitrepository.pillar.messagehandler; -import java.io.ByteArrayInputStream; +import jakarta.xml.bind.JAXBException; import org.bitrepository.bitrepositorydata.GetChecksumsResults; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ResponseCode; @@ -49,8 +49,8 @@ import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBException; import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; diff --git a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetFileIDsRequestHandler.java b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetFileIDsRequestHandler.java index f5e49e2bd..a5a87bf38 100644 --- a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetFileIDsRequestHandler.java +++ b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/GetFileIDsRequestHandler.java @@ -25,7 +25,7 @@ */ package org.bitrepository.pillar.messagehandler; -import java.io.ByteArrayInputStream; +import jakarta.xml.bind.JAXBException; import org.bitrepository.bitrepositorydata.GetFileIDsResults; import org.bitrepository.bitrepositoryelements.FileIDsData; import org.bitrepository.bitrepositoryelements.ResponseCode; @@ -50,8 +50,8 @@ import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBException; import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; diff --git a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/checksumdatabase/ExtractedChecksumResultSet.java b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/checksumdatabase/ExtractedChecksumResultSet.java index 563b1d08f..7176cadbe 100644 --- a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/checksumdatabase/ExtractedChecksumResultSet.java +++ b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/checksumdatabase/ExtractedChecksumResultSet.java @@ -59,8 +59,8 @@ public void insertChecksumEntry(ChecksumDataForChecksumSpecTYPE entry) { * @param entry The entry to add. */ public void insertChecksumEntry(ChecksumEntry entry) { - ChecksumDataForChecksumSpecTYPE res = new ChecksumDataForChecksumSpecTYPE(); - res.setCalculationTimestamp(CalendarUtils.getXmlGregorianCalendar(entry.getCalculationDate())); + var res = new ChecksumDataForChecksumSpecTYPE(); + res.setCalculationTimestamp(CalendarUtils.getXmlGregorianCalendar(entry.getCalculationInstant())); try { res.setChecksumValue(Base16Utils.encodeBase16(entry.getChecksum())); } catch (DecoderException e) { diff --git a/bitrepository-reference-pillar/src/main/resources/sql/postgres/checksumDBCreation.sql b/bitrepository-reference-pillar/src/main/resources/sql/postgres/checksumDBCreation.sql index 342f0c3da..8691cb0b6 100644 --- a/bitrepository-reference-pillar/src/main/resources/sql/postgres/checksumDBCreation.sql +++ b/bitrepository-reference-pillar/src/main/resources/sql/postgres/checksumDBCreation.sql @@ -29,12 +29,12 @@ -- of the tables, especially when upgrading. -- Expected entry count: only those in this script. --**************************************************************************-- -CREATE TABLE tableversions ( +CREATE TABLE IF NOT EXISTS tableversions ( tablename VARCHAR(100) NOT NULL, -- Name of table version INT NOT NULL -- version of table ); -INSERT INTO tableversions ( tablename, version ) VALUES ( 'checksums', 4); +INSERT INTO tableversions ( tablename, version ) VALUES ( 'checksums', 4) ON CONFLICT DO NOTHING; --*************************************************************************-- -- Name: checksums @@ -44,7 +44,7 @@ INSERT INTO tableversions ( tablename, version ) VALUES ( 'checksums', 4); -- Purpose: Keep track of the checksum entries. -- Expected entry count: Very many, one for each file.. --*************************************************************************-- -CREATE TABLE checksums ( +CREATE TABLE IF NOT EXISTS checksums ( guid SERIAL PRIMARY KEY, -- The sequence number and unique key for this table. fileid VARCHAR(255) NOT NULL, -- The id of the file. collectionid VARCHAR(255) NOT NULL, -- The id of the collection. @@ -52,6 +52,6 @@ CREATE TABLE checksums ( calculationdate BIGINT -- The timestamp for the calculation of the checksum. ); -CREATE INDEX fileindex ON checksums ( fileid, collectionid ); -CREATE INDEX filedateindex ON checksums ( fileid, calculationdate ); -CREATE INDEX calculationindex ON checksums ( calculationdate ); +CREATE INDEX IF NOT EXISTS fileindex ON checksums ( fileid, collectionid ); +CREATE INDEX IF NOT EXISTS filedateindex ON checksums ( fileid, calculationdate ); +CREATE INDEX IF NOT EXISTS calculationindex ON checksums ( calculationdate ); diff --git a/bitrepository-reference-pillar/src/main/resources/sql/postgres/correctChecksumDB3to4Migration.sql b/bitrepository-reference-pillar/src/main/resources/sql/postgres/correctChecksumDB3to4Migration.sql index 3bed2d936..e4c43237c 100644 --- a/bitrepository-reference-pillar/src/main/resources/sql/postgres/correctChecksumDB3to4Migration.sql +++ b/bitrepository-reference-pillar/src/main/resources/sql/postgres/correctChecksumDB3to4Migration.sql @@ -20,4 +20,4 @@ -- #L% --- ALTER TABLE checksums RENAME COLUMN calculationdate2 TO calculationdate; -CREATE INDEX calculationindex ON checksums ( calculationdate ); +CREATE INDEX IF NOT EXISTS calculationindex ON checksums ( calculationdate ); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryPerformanceTestSuite.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryPerformanceTestSuite.java deleted file mode 100644 index 4470c5e62..000000000 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryPerformanceTestSuite.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.bitrepository.pillar; - -import org.junit.platform.suite.api.*; - -/** - * BitrepositoryPerformanceTestSuite is a JUnit 5 suite class that groups and configures multiple test classes - * for the BitRepositoryPillar project. - */ -@Suite -@SuiteDisplayName("Performance Test") -@SelectPackages({"org.bitrepository.pillar.integration.perf"}) -@IncludeClassNamePatterns(value = "^(Test.*|.+[.$]Test.*|.*Tests?|.*IT)$") -@IncludeTags("pillar-stress-test") -@ConfigurationParameter(key = "pillarType", value = "File") -public class BitrepositoryPerformanceTestSuite { -} diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryPillarCommonIntegrationTestSuite.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryPillarCommonIntegrationTestSuite.java new file mode 100644 index 000000000..d40946f2d --- /dev/null +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryPillarCommonIntegrationTestSuite.java @@ -0,0 +1,19 @@ +package org.bitrepository.pillar; + +import org.junit.platform.suite.api.ExcludePackages; +import org.junit.platform.suite.api.IncludeClassNamePatterns; +import org.junit.platform.suite.api.SelectPackages; +import org.junit.platform.suite.api.Suite; +import org.junit.platform.suite.api.SuiteDisplayName; + +/** + * BitrepositoryPillarTestSuite is a JUnit 5 suite class that groups and configures multiple test classes + * for the BitRepositoryPillar project. + */ +@Suite +@SuiteDisplayName("Common Acceptance Test") +@SelectPackages({"org.bitrepository.pillar"}) +@ExcludePackages("org.bitrepository.pillar.integration") +@IncludeClassNamePatterns(value = {"^(.*IT)$"}) +public class BitrepositoryPillarCommonIntegrationTestSuite { +} diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultFixturePillarTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultFixturePillarIT.java similarity index 61% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultFixturePillarTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultFixturePillarIT.java index 8b49b9494..95d7b4ef8 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultFixturePillarTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultFixturePillarIT.java @@ -1,44 +1,56 @@ /* * #%L * Bitrepository Protocol - * + * * $Id: DefaultFixturePillarTest.java 452 2011-11-10 09:59:11Z mss $ * $HeadURL: https://sbforge.org/svn/bitrepository/bitrepository-reference/trunk/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultFixturePillarTest.java $ * %% * Copyright (C) 2010 - 2011 The State and University Library, The Royal Library and The State Archives, Denmark * %% * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public + * + * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * . * #L% */ package org.bitrepository.pillar; +import jakarta.jms.JMSException; import org.bitrepository.common.settings.Settings; +import org.bitrepository.pillar.integration.ArtemisFixedPortContainer; import org.bitrepository.protocol.IntegrationTest; +import org.bitrepository.protocol.activemq.ActiveMQMessageBus; import org.bitrepository.protocol.bus.MessageReceiver; +import org.bitrepository.protocol.messagebus.MessageBusManager; import org.bitrepository.settings.repositorysettings.Collection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.activemq.ArtemisContainer; +import org.testcontainers.containers.InternetProtocol; +import org.testcontainers.junit.jupiter.Container; -/** - * Contains the generic parts for pillar tests integrating to the message bus. - * Mostly copied from DefaultFixtureClientTest... - */ -public abstract class DefaultFixturePillarTest extends IntegrationTest { +import java.util.List; + +public abstract class DefaultFixturePillarIT extends IntegrationTest { + private static final Logger log = LoggerFactory.getLogger(DefaultFixturePillarIT.class); protected static String pillarDestinationId; protected String clientDestinationId; protected MessageReceiver clientReceiver; + @Container + static ArtemisContainer activemq = new ArtemisFixedPortContainer("apache/artemis:2.55.0") + .withFixedExposedPort(9999, 61616, InternetProtocol.TCP); + /** * Replaces the pillarID references in the settings will test specific pillarIDs. */ @@ -60,6 +72,41 @@ protected void registerMessageReceivers() { pillarDestinationId = settingsForCUT.getContributorDestinationID(); } + @Override + protected void setupMessageBus() { + activemq.start(); + while (!activemq.isRunning()) { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + messageBus = new ActiveMQMessageBus(settingsForTestClient, securityManager); + MessageBusManager.clear(); + MessageBusManager.injectCustomMessageBus(MessageBusManager.DEFAULT_MESSAGE_BUS, messageBus); + } + + /** + * Shutdown the message bus. + */ + @Override + protected void teardownMessageBus() { + MessageBusManager.clear(); + if (messageBus != null) { + try { + messageBus.setComponentFilter(List.of()); + messageBus.setCollectionFilter(List.of()); + + messageBus.close(); + messageBus = null; + } catch (JMSException e) { + log.warn("Failed to close messageBus", e); + } + } + } + protected String getPillarID() { return getComponentID(); } @@ -68,7 +115,7 @@ protected String getPillarID() { private static final String DEFAULT_PILLAR_ID_TO_REPLACE = "Pillar1"; /** - * Sets the given id to be the pillar id, also in the collections. + * Sets the given id to be the pillar id, also in the collections. * @param settings The settings. * @param pillarID The new pillar id. */ diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultPillarTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultPillarIT.java similarity index 93% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultPillarTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultPillarIT.java index f6059f36f..aadb31c49 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultPillarTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultPillarIT.java @@ -49,7 +49,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addFixture; -public abstract class DefaultPillarTest extends DefaultFixturePillarTest { +public abstract class DefaultPillarIT extends DefaultFixturePillarIT { protected FileStore archives; protected StorageModel model; protected PillarMediator mediator; @@ -76,8 +76,13 @@ public abstract class DefaultPillarTest extends DefaultFixturePillarTest { @Override protected void initializeCUT() { super.initializeCUT(); - collectionID = settingsForTestClient.getCollections().get(0).getID(); - File fileDir = new File(settingsForCUT.getReferenceSettings().getPillarSettings().getCollectionDirs().get(0).getFileDirs().get(0)); + collectionID = settingsForTestClient.getCollections().getFirst().getID(); + File fileDir = new File(settingsForCUT.getReferenceSettings() + .getPillarSettings() + .getCollectionDirs() + .getFirst() + .getFileDirs() + .getFirst()); if (fileDir.exists()) { FileUtils.delete(fileDir); } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MediatorTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MediatorIT.java similarity index 98% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MediatorTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MediatorIT.java index bba7411a4..c92c4f49c 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MediatorTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MediatorIT.java @@ -51,7 +51,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -public class MediatorTest extends DefaultFixturePillarTest { +public class MediatorIT extends DefaultFixturePillarIT { MockAuditManager audits; MessageHandlerContext context; StorageModel model = null; @@ -105,7 +105,7 @@ protected String getComponentID() { return "MediatorUnderTest"; } - private static class TestMediator extends PillarMediator { + private class TestMediator extends PillarMediator { public TestMediator(MessageHandlerContext context, StorageModel model) { super(messageBus, context, model); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MockedPillarTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MockedPillarIT.java similarity index 97% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MockedPillarTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MockedPillarIT.java index 5fb0a0528..1103f1f05 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MockedPillarTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MockedPillarIT.java @@ -35,11 +35,12 @@ import org.bitrepository.protocol.FileExchange; import org.bitrepository.service.audit.MockAuditManager; import org.bitrepository.service.contributor.ResponseDispatcher; +import org.junit.jupiter.api.AfterEach; import static org.bitrepository.common.utils.AllureTestUtils.addFixture; import static org.mockito.Mockito.mock; -public abstract class MockedPillarTest extends DefaultFixturePillarTest { +public abstract class MockedPillarIT extends DefaultFixturePillarIT { protected PillarMediator mediator; protected StorageModel model; protected MockAuditManager audits; diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/PillarTestGroups.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/PillarTestGroups.java index 8068aa87b..d268b916f 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/PillarTestGroups.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/PillarTestGroups.java @@ -27,4 +27,5 @@ public class PillarTestGroups { public static final String FULL_PILLAR_TEST = "fullPillarTest"; public static final String OPERATION_ACCEPTED_PROGRESS = "operationAcceptedProgress"; public static final String RESULT_UPLOAD = "resultUploadTest"; + public static final String PILLAR_STRESS_TEST = "pillar-stress-test"; } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryChecksumPillarTestSuite.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/BitrepositoryChecksumPillarTestSuite.java similarity index 63% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryChecksumPillarTestSuite.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/BitrepositoryChecksumPillarTestSuite.java index d3b66bc78..30fbed954 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryChecksumPillarTestSuite.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/BitrepositoryChecksumPillarTestSuite.java @@ -1,5 +1,6 @@ -package org.bitrepository.pillar; +package org.bitrepository.pillar.integration; +import org.bitrepository.pillar.PillarTestGroups; import org.junit.platform.suite.api.*; /** @@ -10,7 +11,11 @@ @SuiteDisplayName("Checksum Pillar Acceptance Test") @SelectPackages({"org.bitrepository.pillar.integration.func"}) @IncludeTags({PillarTestGroups.CHECKSUM_PILLAR_TEST}) -@IncludeClassNamePatterns(value = "^(Test.*|.+[.$]Test.*|.*Tests?|.*IT)$") +@IncludeClassNamePatterns(value = {"^(Test.*)$", + "^(.+[.$]Test.*)$", + "^(.*Tests?)$", + "^(.*IT)$" +}) @ConfigurationParameter(key = "pillarType", value = "Checksum") public class BitrepositoryChecksumPillarTestSuite { } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/BitrepositoryPerformanceTestSuite.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/BitrepositoryPerformanceTestSuite.java new file mode 100644 index 000000000..d39dd0b46 --- /dev/null +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/BitrepositoryPerformanceTestSuite.java @@ -0,0 +1,23 @@ +package org.bitrepository.pillar.integration; + +import org.bitrepository.pillar.PillarTestGroups; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; +import org.junit.platform.suite.api.*; + +/** + * BitrepositoryPerformanceTestSuite is a JUnit 5 suite class that groups and configures multiple test classes + * for the BitRepositoryPillar project. + */ +@Suite +@SuiteDisplayName("Performance Test") +@SelectPackages({"org.bitrepository.pillar.integration.perf"}) +@IncludeClassNamePatterns(value = {"^(Test.*)$", + "^(.+[.$]Test.*)$", + "^(.*Tests?)$", + "^(.*IT)$" +}) +@IncludeTags(PillarTestGroups.PILLAR_STRESS_TEST) +@ConfigurationParameter(key = "pillarType", value = "File") +@EnabledIfSystemProperty(named = "runStressTests", matches = "true") +public class BitrepositoryPerformanceTestSuite { +} diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryPillarTestSuite.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/BitrepositoryPillarTestSuite.java similarity index 61% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryPillarTestSuite.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/BitrepositoryPillarTestSuite.java index 4f0fef3a9..4a3e6dfb1 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/BitrepositoryPillarTestSuite.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/BitrepositoryPillarTestSuite.java @@ -1,5 +1,6 @@ -package org.bitrepository.pillar; +package org.bitrepository.pillar.integration; +import org.bitrepository.pillar.PillarTestGroups; import org.junit.platform.suite.api.*; /** @@ -9,7 +10,11 @@ @Suite @SuiteDisplayName("Full Pillar Acceptance Test") @SelectPackages({"org.bitrepository.pillar.integration.func"}) -@IncludeClassNamePatterns(value = "^(Test.*|.+[.$]Test.*|.*Tests?|.*IT)$") +@IncludeClassNamePatterns(value = {"^(Test.*)$", + "^(.+[.$]Test.*)$", + "^(.*Tests?)$", + "^(.*IT)$" +}) @IncludeTags({PillarTestGroups.FULL_PILLAR_TEST}) @ConfigurationParameter(key = "pillarType", value = "File") public class BitrepositoryPillarTestSuite { diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/PillarIntegrationTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/PillarIntegrationIT.java similarity index 77% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/PillarIntegrationTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/PillarIntegrationIT.java index 2bb5492d2..f00f97d13 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/PillarIntegrationTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/PillarIntegrationIT.java @@ -23,6 +23,7 @@ import io.qameta.allure.Allure; import jakarta.jms.JMSException; +import org.apache.commons.io.FileUtils; import org.bitrepository.SuiteInfo; import org.bitrepository.SuiteInfoParameterResolver; import org.bitrepository.client.conversation.mediator.CollectionBasedConversationMediator; @@ -53,17 +54,28 @@ import org.bitrepository.protocol.security.SecurityManager; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.TestInfo; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.platform.suite.api.AfterSuite; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - +import org.testcontainers.activemq.ArtemisContainer; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.InternetProtocol; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; + +import java.io.BufferedInputStream; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; import static org.bitrepository.common.utils.AllureTestUtils.isTestRunning; @@ -75,7 +87,8 @@ */ @TestInstance(TestInstance.Lifecycle.PER_CLASS) @ExtendWith(SuiteInfoParameterResolver.class) -public abstract class PillarIntegrationTest extends IntegrationTest { +@Testcontainers(parallel = true, disabledWithoutDocker = true) +public abstract class PillarIntegrationIT extends IntegrationTest { /** * The path to the directory containing the integration test configuration files */ @@ -98,18 +111,26 @@ public abstract class PillarIntegrationTest extends IntegrationTest { protected static String nonDefaultCollectionId; protected static String irrelevantCollectionId; protected static ClientEventLogger clientEventHandler; - private static final Logger log = LoggerFactory.getLogger(PillarIntegrationTest.class); - @Override - protected void initializeCUT() { - super.initializeCUT(); - reloadMessageBus(); - clientProvider = new ClientProvider(securityManager, settingsForTestClient); - pillarFileManager = new PillarFileManager(collectionID, - getPillarID(), settingsForTestClient, clientProvider, httpServerConfiguration); - clientEventHandler = new ClientEventLogger(); - } - - /** + private static final Logger log = LoggerFactory.getLogger(PillarIntegrationIT.class); + + @Container + static ArtemisContainer activemq = new ArtemisFixedPortContainer("apache/artemis:2.55.0") + .withFixedExposedPort(61616, 61616, InternetProtocol.TCP); + @Container + static PostgreSQLContainer auditTrailDB = new PostgresFixedPortContainer("postgres:18-alpine") + .withFixedExposedPort(65432, 5432, InternetProtocol.TCP) + .withDatabaseName("auditcontributerdb") + .withUsername("testcontainerUser") + .withPassword("testcontainerPassword") + .withLabel("purpose","auditcontributerdb"); + @Container + static PostgreSQLContainer checksumDB = new PostgresFixedPortContainer("postgres:18-alpine") + .withFixedExposedPort(54321, 5432, InternetProtocol.TCP) + .withDatabaseName("checksumdb") + .withUsername("testcontainerUser") + .withPassword("testcontainerPassword") + .withLabel("purpose","checksumdb"); + /** * Initializes the test suite environment. *

* This method is annotated with {@link BeforeAll} and is responsible for: @@ -161,6 +182,7 @@ public void shutdownRealMessageBus() { } messageBus = null; } + activemq.stop(); } } @@ -169,13 +191,30 @@ public void shutdownRealMessageBus() { *

* This includes stopping the embedded reference pillar and calling the superclass's shutdown method. */ - @AfterSuite + @AfterAll @Override public void shutdownSuite() { - stopEmbeddedReferencePillar(); + if (embeddedPillar != null) { + embeddedPillar.shutdown(); + auditTrailDB.stop(); + checksumDB.stop(); + } super.shutdownSuite(); } + @Override + protected void initializeCUT() { + super.initializeCUT(); + reloadMessageBus(); + clientProvider = new ClientProvider(securityManager, settingsForTestClient); + pillarFileManager = new PillarFileManager(collectionID, + getPillarID(), + settingsForTestClient, + clientProvider, + httpServerConfiguration); + clientEventHandler = new ClientEventLogger(); + } + /** * Adds context information to the test result in case of failure. *

@@ -191,6 +230,7 @@ public void addFailureContextInfo(TestInfo result) { protected void setupRealMessageBus() { if (!useEmbeddedMessageBus()) { MessageBusManager.clear(); + startContainer(activemq); messageBus = MessageBusManager.getMessageBus(settingsForCUT, securityManager); } else { messageBus = new SimpleMessageBus(); @@ -204,15 +244,20 @@ protected void setupRealMessageBus() { } } - @Override - public void initMessagebus() { - //Shortcircuit this so the messagebus is NOT INITIALISED BEFORE THE CONFIGURATION - //super.initMessagebus(); + private static void startContainer(final GenericContainer container) { + container.start(); + while (!container.isRunning()) { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } } /** * Will start an embedded reference pillar if specified in the pillar-integration-test.properties.

- * The type of pillar (full or checksum) is baed on the test group used, eg. if the group is + * The type of pillar (full or checksum) is baed on the test group used, i.e. if the group is * checksumPillarTest a checksum pillar is started, else a normal 'full' reference pillar is started. *

* @@ -220,6 +265,8 @@ public void initMessagebus() { */ protected void startEmbeddedPillar(SuiteInfo testInfo) { if (testConfiguration.useEmbeddedPillar()) { + startContainer(auditTrailDB); + startContainer(checksumDB); SettingsUtils.initialize(settingsForCUT); //TODO the tags are for the tags on the class, not the method // And they are not the tags from Suite, so you will not get the behaivour you want... @@ -231,15 +278,9 @@ protected void startEmbeddedPillar(SuiteInfo testInfo) { } } - protected void stopEmbeddedReferencePillar() { - if (embeddedPillar != null) { - embeddedPillar.shutdown(); - } - } - @Override public boolean useEmbeddedMessageBus() { - return true; + return false; } /** @@ -263,14 +304,16 @@ protected long getOperationTimeout() { /** * Overrides the default settings modification, as this only works if the test can inject the modified settings into * the pillar. This means that if we are not using an embedded pillar we need to use the 'raw' collection settings, - * eg. we can not add a special postfix. + * i.e. we can not add a special postfix. * * @Override */ protected String getTopicPostfix() { if (testConfiguration.useEmbeddedPillar()) { return "-" + System.getProperty("user.name"); - } else return ""; + } else { + return ""; + } } @Override @@ -306,8 +349,22 @@ protected void afterMethodVerification() { protected void putDefaultFile() { try { + + Path path = new File(settingsForCUT.getReferenceSettings().getFileExchangeSettings().getPath()).toPath(); + + try { + FileUtils.forceMkdir(path.toFile()); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + URL resource = Thread.currentThread() + .getContextClassLoader() + .getResource("default-test-file.txt"); + Assertions.assertNotNull(resource); + Path srcFile = new File(resource.getFile()).toPath(); + FileExchange fe = ProtocolComponentFactory.getInstance().getFileExchange(settingsForCUT); - try (InputStream fis = getClass().getClassLoader().getResourceAsStream("default-test-file.txt")) { + try (InputStream fis = new BufferedInputStream(Files.newInputStream(srcFile))) { fe.putFile(fis, defaultFileUrl); } catch (IOException e) { throw new UncheckedIOException("Failed to upload default test file", e); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/ReferencePillarDerbyDBTestUtils.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/ReferencePillarDerbyDBTestUtils.java index 246b5ad61..b9a670211 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/ReferencePillarDerbyDBTestUtils.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/ReferencePillarDerbyDBTestUtils.java @@ -5,16 +5,16 @@ * Copyright (C) 2010 - 2012 The State and University Library, The Royal Library and The State Archives, Denmark * %% * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public + * + * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * . * #L% @@ -46,17 +46,41 @@ public ReferencePillarDerbyDBTestUtils(Settings pillarSettings) { */ public void createEmptyDatabases() { DatabaseSpecifics auditTrailDB = - pillarSettings.getReferenceSettings().getPillarSettings().getAuditTrailContributerDatabase(); - DerbyDatabaseDestroyer.deleteDatabase(auditTrailDB); - PillarAuditTrailDatabaseCreator pillarAuditTrailDatabaseCreator = - new PillarAuditTrailDatabaseCreator(); - pillarAuditTrailDatabaseCreator.createAuditTrailContributorDatabase(pillarSettings, null); + pillarSettings.getReferenceSettings().getPillarSettings().getAuditTrailContributerDatabase(); + var pillarAuditTrailDBCreator = new PillarAuditTrailDatabaseCreator(); + switch (auditTrailDB.getDriverClass()) { + case "org.postgresql.Driver": { + pillarAuditTrailDBCreator.createAuditTrailContributorDatabase(pillarSettings, + "sql/postgres/auditContributorDBCreation.sql"); + break; + } + case "org.apache.derby.jdbc.EmbeddedDriver": + default: { + + DerbyDatabaseDestroyer.deleteDatabase(auditTrailDB); + PillarAuditTrailDatabaseCreator pillarAuditTrailDatabaseCreator = + new PillarAuditTrailDatabaseCreator(); + pillarAuditTrailDatabaseCreator.createAuditTrailContributorDatabase(pillarSettings, + "sql/derby/auditContributorDBCreation.sql"); + break; + } + } DatabaseSpecifics checksumDB = - pillarSettings.getReferenceSettings().getPillarSettings().getChecksumDatabase(); - DerbyDatabaseDestroyer.deleteDatabase(checksumDB); + pillarSettings.getReferenceSettings().getPillarSettings().getChecksumDatabase(); + var checksumDBCreator = new ChecksumDatabaseCreator(); + switch (checksumDB.getDriverClass()) { + case "org.postgresql.Driver": { + checksumDBCreator.createChecksumDatabase(pillarSettings, "sql/postgres/checksumDBCreation.sql"); + break; + } + case "org.apache.derby.jdbc.EmbeddedDriver": + default: { + DerbyDatabaseDestroyer.deleteDatabase(checksumDB); + checksumDBCreator.createChecksumDatabase(pillarSettings, "sql/derby/checksumDBCreation.sql"); + break; + } + } - ChecksumDatabaseCreator checksumDatabaseCreator = new ChecksumDatabaseCreator(); - checksumDatabaseCreator.createChecksumDatabase(pillarSettings, null); } } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarIdentificationTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarIdentificationIT.java similarity index 89% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarIdentificationTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarIdentificationIT.java index e144e35e2..3d67d4aba 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarIdentificationTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarIdentificationIT.java @@ -33,14 +33,14 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -public abstract class DefaultPillarIdentificationTest extends DefaultPillarMessagingTest { +public abstract class DefaultPillarIdentificationIT extends DefaultPillarMessagingIT { @Test @Tag(PillarTestGroups.FULL_PILLAR_TEST) @Tag(PillarTestGroups.CHECKSUM_PILLAR_TEST) public void irrelevantCollectionTest() { addDescription("Verifies identification works correctly for a collection not defined for the pillar"); - addStep("Sending a putFile identification with a irrelevant collectionID. eg. the " + + addStep("Sending a putFile identification with a irrelevant collectionID. i.e. the " + " pillar is not part of the collection", "The pillar under test should not make a response"); MessageRequest request = createRequest(); @@ -49,8 +49,8 @@ public void irrelevantCollectionTest() { assertNoResponseIsReceived(); } - protected void assertPositivResponseIsReceived() { - MessageResponse receivedResponse = receiveResponse(); + protected void assertPositivResponseIsReceived(MessageRequest request) { + MessageResponse receivedResponse = receiveResponse(request); Assertions.assertEquals(ResponseCode.IDENTIFICATION_POSITIVE, receivedResponse.getResponseInfo().getResponseCode()); } } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarMessagingTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarMessagingIT.java similarity index 79% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarMessagingTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarMessagingIT.java index e5f7a1068..cc7479400 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarMessagingTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarMessagingIT.java @@ -26,6 +26,7 @@ import org.bitrepository.bitrepositorymessages.MessageRequest; import org.bitrepository.bitrepositorymessages.MessageResponse; import org.bitrepository.pillar.PillarTestGroups; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -38,7 +39,7 @@ * implement the abstract methods and add any operation specific tests. The test will not work for Alarm and status * messaging, as it is assumed that operations are collection scope. */ -public abstract class DefaultPillarMessagingTest extends PillarFunctionTest { +public abstract class DefaultPillarMessagingIT extends PillarFunctionIT { @Test @Tag(PillarTestGroups.FULL_PILLAR_TEST) @@ -51,7 +52,7 @@ public void missingCollectionIDTest() { request.setCollectionID(null); messageBus.sendMessage(request); - MessageResponse receivedResponse = receiveResponse(); + MessageResponse receivedResponse = receiveResponse(request); Assertions.assertEquals(ResponseCode.REQUEST_NOT_UNDERSTOOD_FAILURE, receivedResponse.getResponseInfo().getResponseCode()); } @@ -66,14 +67,19 @@ public void otherCollectionTest() { MessageRequest request = createRequest(); request.setCollectionID(nonDefaultCollectionId); messageBus.sendMessage(request); - assertPositivResponseIsReceived(); + MessageResponse receivedResponse = receiveResponse(request); + + if (this.getClass().getSimpleName().startsWith("Identify")){ + // I challenge the next guy to figure out when the code is IDENTIFICATION_POSITIVE and when it is OPERATION_COMPLETED + Assertions.assertEquals(ResponseCode.IDENTIFICATION_POSITIVE, receivedResponse.getResponseInfo().getResponseCode()); + } else { + Assertions.assertEquals(ResponseCode.OPERATION_COMPLETED, receivedResponse.getResponseInfo().getResponseCode()); + } } protected abstract MessageRequest createRequest(); - protected abstract MessageResponse receiveResponse(); - - protected abstract void assertPositivResponseIsReceived(); + protected abstract MessageResponse receiveResponse(MessageRequest request); protected abstract void assertNoResponseIsReceived(); } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarOperationTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarOperationIT.java similarity index 80% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarOperationTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarOperationIT.java index 63a4d834e..d9e477a5c 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarOperationTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/DefaultPillarOperationIT.java @@ -23,13 +23,14 @@ package org.bitrepository.pillar.integration.func; import org.bitrepository.bitrepositoryelements.ResponseCode; +import org.bitrepository.bitrepositorymessages.MessageRequest; import org.bitrepository.bitrepositorymessages.MessageResponse; import org.junit.jupiter.api.Assertions; -public abstract class DefaultPillarOperationTest extends DefaultPillarMessagingTest { +public abstract class DefaultPillarOperationIT extends DefaultPillarMessagingIT { - protected void assertPositivResponseIsReceived() { - MessageResponse receivedResponse = receiveResponse(); + protected void assertPositivResponseIsReceived(MessageRequest request) { + MessageResponse receivedResponse = receiveResponse(request); Assertions.assertEquals(ResponseCode.OPERATION_COMPLETED, receivedResponse.getResponseInfo().getResponseCode()); } } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/PillarFunctionTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/PillarFunctionIT.java similarity index 85% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/PillarFunctionTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/PillarFunctionIT.java index 1cc90df5f..2c80f5f93 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/PillarFunctionTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/PillarFunctionIT.java @@ -21,9 +21,10 @@ */ package org.bitrepository.pillar.integration.func; -import org.bitrepository.pillar.integration.PillarIntegrationTest; +import org.bitrepository.pillar.integration.PillarIntegrationIT; import org.bitrepository.pillar.messagefactories.PutFileMessageFactory; import org.bitrepository.protocol.bus.MessageReceiver; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.TestInfo; @@ -34,7 +35,7 @@ * The parent class for pillar acceptance tests. The tests can be run in a multi pillar collection has the tests will * ignore responses from other pillars. */ -public abstract class PillarFunctionTest extends PillarIntegrationTest { +public abstract class PillarFunctionIT extends PillarIntegrationIT { protected static final Long DEFAULT_FILE_SIZE = 10L; protected PutFileMessageFactory msgFactory; protected String testSpecificFileID; @@ -50,11 +51,15 @@ public void generalMethodSetup(TestInfo testInfo) throws Exception { protected void registerMessageReceivers() { super.registerMessageReceivers(); - clientReceiver = new MessageReceiver(settingsForTestClient.getReceiverDestinationID()); - addReceiver(clientReceiver); + clientReceiver = addReceiver(new MessageReceiver(settingsForTestClient.getReceiverDestinationID())); Collection pillarFilter = Collections.singletonList(testConfiguration.getPillarUnderTestID()); clientReceiver.setFromFilter(pillarFilter); alarmReceiver.setFromFilter(pillarFilter); } + + @AfterEach + void clearReceiver(){ + clientReceiver.clearMessages(); + } } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/deletefile/DeleteFileRequestIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/deletefile/DeleteFileRequestIT.java index 9ec15f4b8..283864b72 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/deletefile/DeleteFileRequestIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/deletefile/DeleteFileRequestIT.java @@ -35,7 +35,7 @@ import org.bitrepository.common.utils.Base16Utils; import org.bitrepository.common.utils.TestFileHelper; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.DefaultPillarOperationTest; +import org.bitrepository.pillar.integration.func.DefaultPillarOperationIT; import org.bitrepository.pillar.messagefactories.DeleteFileMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -47,7 +47,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class DeleteFileRequestIT extends DefaultPillarOperationTest { +class DeleteFileRequestIT extends DefaultPillarOperationIT { protected DeleteFileMessageFactory msgFactory; private String pillarDestination; @@ -71,19 +71,20 @@ void normalDeleteFileTest() { addStep("Send a DeleteFile request to " + testConfiguration.getPillarUnderTestID(), "The pillar should generate a OPERATION_ACCEPTED_PROGRESS progress response followed by a " + "OPERATION_COMPLETED final response"); - DeleteFileRequest deleteRequest = (DeleteFileRequest) createRequest(); + DeleteFileRequest deleteRequest = createRequest(); deleteRequest.setFileID(testSpecificFileID); messageBus.sendMessage(deleteRequest); DeleteFileProgressResponse progressResponse = - clientReceiver.waitForMessage(DeleteFileProgressResponse.class, getOperationTimeout(), TimeUnit.SECONDS); + clientReceiver.waitForMessage(DeleteFileProgressResponse.class, getOperationTimeout(), TimeUnit.SECONDS, + deleteRequest.getCorrelationID()); Assertions.assertNotNull(progressResponse); Assertions.assertEquals(deleteRequest.getCorrelationID(), progressResponse.getCorrelationID()); Assertions.assertEquals(getPillarID(), progressResponse.getFrom()); Assertions.assertEquals(getPillarID(), progressResponse.getPillarID()); Assertions.assertEquals(ResponseCode.OPERATION_ACCEPTED_PROGRESS, progressResponse.getResponseInfo().getResponseCode()); - DeleteFileFinalResponse finalResponse = (DeleteFileFinalResponse) receiveResponse(); + DeleteFileFinalResponse finalResponse = receiveResponse(deleteRequest); Assertions.assertNotNull(finalResponse); Assertions.assertEquals(ResponseCode.OPERATION_COMPLETED, finalResponse.getResponseInfo().getResponseCode()); Assertions.assertEquals(deleteRequest.getCorrelationID(), finalResponse.getCorrelationID()); @@ -111,15 +112,18 @@ void requestNewChecksumDeleteFileTest() { TestFileHelper.getDefaultFileChecksum(), requestedChecksumSpec, testSpecificFileID); messageBus.sendMessage(deleteRequest); - DeleteFileProgressResponse progressResponse = clientReceiver.waitForMessage(DeleteFileProgressResponse.class, - getOperationTimeout(), TimeUnit.SECONDS); + var progressResponse = clientReceiver.waitForMessage( + DeleteFileProgressResponse.class, + getOperationTimeout(), + TimeUnit.SECONDS, + deleteRequest.getCorrelationID()); Assertions.assertNotNull(progressResponse); Assertions.assertEquals(deleteRequest.getCorrelationID(), progressResponse.getCorrelationID()); Assertions.assertEquals(getPillarID(), progressResponse.getFrom()); Assertions.assertEquals(getPillarID(), progressResponse.getPillarID()); Assertions.assertEquals(ResponseCode.OPERATION_ACCEPTED_PROGRESS, progressResponse.getResponseInfo().getResponseCode()); - DeleteFileFinalResponse finalResponse = (DeleteFileFinalResponse) receiveResponse(); + DeleteFileFinalResponse finalResponse = receiveResponse(deleteRequest); Assertions.assertNotNull(finalResponse); Assertions.assertEquals(ResponseCode.OPERATION_COMPLETED, finalResponse.getResponseInfo().getResponseCode()); Assertions.assertEquals(deleteRequest.getCorrelationID(), finalResponse.getCorrelationID()); @@ -136,14 +140,15 @@ void requestNewChecksumDeleteFileTest() { } @Override - protected MessageRequest createRequest() { + protected DeleteFileRequest createRequest() { return msgFactory.createDeleteFileRequest(TestFileHelper.getDefaultFileChecksum(), null, defaultFileId); } @Override - protected MessageResponse receiveResponse() { - return clientReceiver.waitForMessage(DeleteFileFinalResponse.class, getOperationTimeout(), - TimeUnit.SECONDS); + protected DeleteFileFinalResponse receiveResponse(MessageRequest request) { + return clientReceiver.waitForMessage(DeleteFileFinalResponse.class, + getOperationTimeout(), TimeUnit.SECONDS, + request.getCorrelationID()); } protected void assertNoResponseIsReceived() { diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/deletefile/IdentifyPillarsForDeleteFileIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/deletefile/IdentifyPillarsForDeleteFileIT.java index 4e0f1f85f..fea93898b 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/deletefile/IdentifyPillarsForDeleteFileIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/deletefile/IdentifyPillarsForDeleteFileIT.java @@ -27,7 +27,7 @@ import org.bitrepository.bitrepositorymessages.MessageRequest; import org.bitrepository.bitrepositorymessages.MessageResponse; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.DefaultPillarIdentificationTest; +import org.bitrepository.pillar.integration.func.DefaultPillarIdentificationIT; import org.bitrepository.pillar.messagefactories.DeleteFileMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -38,7 +38,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class IdentifyPillarsForDeleteFileIT extends DefaultPillarIdentificationTest { +class IdentifyPillarsForDeleteFileIT extends DefaultPillarIdentificationIT { protected DeleteFileMessageFactory msgFactory; @BeforeEach @@ -53,11 +53,10 @@ void normalIdentificationTest() { addDescription("Verifies the normal behaviour for deleteFile identification"); addStep("Sending a deleteFile identification.", "The pillar under test should make a response with the correct elements."); - IdentifyPillarsForDeleteFileRequest identifyRequest = (IdentifyPillarsForDeleteFileRequest) createRequest(); + IdentifyPillarsForDeleteFileRequest identifyRequest = createRequest(); messageBus.sendMessage(identifyRequest); - IdentifyPillarsForDeleteFileResponse receivedIdentifyResponse = clientReceiver.waitForMessage( - IdentifyPillarsForDeleteFileResponse.class); + IdentifyPillarsForDeleteFileResponse receivedIdentifyResponse = receiveResponse(identifyRequest); Assertions.assertEquals(identifyRequest.getCollectionID(), receivedIdentifyResponse.getCollectionID()); Assertions.assertEquals(identifyRequest.getCorrelationID(), receivedIdentifyResponse.getCorrelationID()); Assertions.assertEquals(getPillarID(), receivedIdentifyResponse.getFrom()); @@ -75,11 +74,10 @@ void identificationTestForChecksumPillar() { addStep("Sending a deleteFile identification.", "The pillar under test should make a response with the correct elements. The only different from a " + "full pillar is that the checksum pillar will respond with the default checksum spec."); - IdentifyPillarsForDeleteFileRequest identifyRequest = (IdentifyPillarsForDeleteFileRequest) createRequest(); + IdentifyPillarsForDeleteFileRequest identifyRequest = createRequest(); messageBus.sendMessage(identifyRequest); - IdentifyPillarsForDeleteFileResponse receivedIdentifyResponse = clientReceiver.waitForMessage( - IdentifyPillarsForDeleteFileResponse.class); + IdentifyPillarsForDeleteFileResponse receivedIdentifyResponse = receiveResponse(identifyRequest); Assertions.assertEquals(identifyRequest.getCollectionID(), receivedIdentifyResponse.getCollectionID()); Assertions.assertEquals(identifyRequest.getCorrelationID(), receivedIdentifyResponse.getCorrelationID()); Assertions.assertEquals(getPillarID(), receivedIdentifyResponse.getFrom()); @@ -100,20 +98,19 @@ void fileDoesNotExistsTest() { nonDefaultFileId); messageBus.sendMessage(identifyRequest); - IdentifyPillarsForDeleteFileResponse receivedIdentifyResponse = clientReceiver.waitForMessage( - IdentifyPillarsForDeleteFileResponse.class); + IdentifyPillarsForDeleteFileResponse receivedIdentifyResponse = receiveResponse(identifyRequest); Assertions.assertEquals(ResponseCode.FILE_NOT_FOUND_FAILURE, receivedIdentifyResponse.getResponseInfo().getResponseCode()); } @Override - protected MessageRequest createRequest() { + protected IdentifyPillarsForDeleteFileRequest createRequest() { return msgFactory.createIdentifyPillarsForDeleteFileRequest(defaultFileId); } @Override - protected MessageResponse receiveResponse() { - return clientReceiver.waitForMessage(IdentifyPillarsForDeleteFileResponse.class); + protected IdentifyPillarsForDeleteFileResponse receiveResponse(MessageRequest request) { + return clientReceiver.waitForMessage(IdentifyPillarsForDeleteFileResponse.class, request.getCorrelationID()); } @Override diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getaudittrails/GetAuditTrailsTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getaudittrails/GetAuditTrailsIT.java similarity index 98% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getaudittrails/GetAuditTrailsTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getaudittrails/GetAuditTrailsIT.java index 3255baabf..afb121bbe 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getaudittrails/GetAuditTrailsTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getaudittrails/GetAuditTrailsIT.java @@ -26,7 +26,7 @@ import org.bitrepository.bitrepositoryelements.AuditTrailEvent; import org.bitrepository.client.exceptions.NegativeResponseException; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.PillarFunctionTest; +import org.bitrepository.pillar.integration.func.PillarFunctionIT; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -40,7 +40,7 @@ @Tag(PillarTestGroups.FULL_PILLAR_TEST) @Tag(PillarTestGroups.CHECKSUM_PILLAR_TEST) -class GetAuditTrailsTest extends PillarFunctionTest { +class GetAuditTrailsIT extends PillarFunctionIT { @Override protected void initializeCUT() { super.initializeCUT(); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumIT.java similarity index 97% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumIT.java index 516cce89d..bc474c26d 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumIT.java @@ -28,7 +28,7 @@ import org.bitrepository.client.exceptions.NegativeResponseException; import org.bitrepository.common.utils.Base16Utils; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.PillarFunctionTest; +import org.bitrepository.pillar.integration.func.PillarFunctionIT; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Tag; @@ -41,7 +41,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @TestInstance(TestInstance.Lifecycle.PER_CLASS) -class GetChecksumTest extends PillarFunctionTest { +class GetChecksumIT extends PillarFunctionIT { @BeforeAll void retrieveFirst2Files() { diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumQueryTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumQueryIT.java similarity index 82% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumQueryTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumQueryIT.java index 95036e038..dc793b5cb 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumQueryTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/GetChecksumQueryIT.java @@ -25,7 +25,7 @@ import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; import org.bitrepository.common.utils.CalendarUtils; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.PillarFunctionTest; +import org.bitrepository.pillar.integration.func.PillarFunctionIT; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -40,7 +40,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addFixture; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class GetChecksumQueryTest extends PillarFunctionTest { +class GetChecksumQueryIT extends PillarFunctionIT { @Test @Tag(PillarTestGroups.FULL_PILLAR_TEST) @@ -84,7 +84,7 @@ void maxNumberOfResultTest() { singleChecksumQuery, null); Assertions.assertEquals(1, singleChecksumList.size(), "The result didn't contain a single checksum"); - Assertions.assertEquals(originalChecksumList.get(0), singleChecksumList.get(0), + Assertions.assertEquals(originalChecksumList.getFirst(), singleChecksumList.getFirst(), "The returned checksum wasn't equal to " + "the oldest checksum"); } @@ -105,47 +105,47 @@ void minTimeStampTest() { "but the test needs this to be satisfied to make sense)."); List originalChecksumList = pillarFileManager.getChecksums(null, null, null); - Assertions.assertTrue(originalChecksumList.get(0).getCalculationTimestamp().compare( - originalChecksumList.get(originalChecksumList.size() - 1).getCalculationTimestamp()) != 0, + Assertions.assertTrue(originalChecksumList.getFirst().getCalculationTimestamp().compare( + originalChecksumList.getLast().getCalculationTimestamp()) != 0, "The timestamps of the first and last checksum are the same."); addStep("Request checksums with MinTimeStamp set to the timestamp of the oldest checksum", "All checksums should be returned."); - XMLGregorianCalendar oldestTimestamp = originalChecksumList.get(0).getCalculationTimestamp(); + XMLGregorianCalendar oldestTimestamp = originalChecksumList.getFirst().getCalculationTimestamp(); ContributorQuery query = new ContributorQuery(getPillarID(), - oldestTimestamp.toGregorianCalendar().getTime(), null, null); + oldestTimestamp.toGregorianCalendar().toInstant(), null, null); List limitedChecksumList = pillarFileManager.getChecksums(null, query, null); Assertions.assertEquals(originalChecksumList.size(), limitedChecksumList.size(), "Differing size of checksum lists"); - Assertions.assertEquals(originalChecksumList.get(0), limitedChecksumList.get(0), + Assertions.assertEquals(originalChecksumList.getFirst(), limitedChecksumList.getFirst(), "Different first list element when " + "setting oldest minTimestamp"); - Assertions.assertEquals(originalChecksumList.get(originalChecksumList.size() - 1), - limitedChecksumList.get(limitedChecksumList.size() - 1), + Assertions.assertEquals(originalChecksumList.getLast(), + limitedChecksumList.getLast(), "Different last list element when setting " + "oldest minTimestamp"); - Assertions.assertTrue(limitedChecksumList.get(0).getCalculationTimestamp().compare( - limitedChecksumList.get(limitedChecksumList.size() - 1).getCalculationTimestamp()) <= 0, + Assertions.assertTrue(limitedChecksumList.getFirst().getCalculationTimestamp().compare( + limitedChecksumList.getLast().getCalculationTimestamp()) <= 0, "First checksum has newer timestamp than last checksum"); addStep("Request checksums with MinTimeStamp set to the timestamp of the newest checksum", "Only checksum with the timestamp equal to MinTimeStamp are returned."); XMLGregorianCalendar newestTimestamp = - originalChecksumList.get(originalChecksumList.size() - 1).getCalculationTimestamp(); - query = new ContributorQuery(getPillarID(), newestTimestamp.toGregorianCalendar().getTime(), + originalChecksumList.getLast().getCalculationTimestamp(); + query = new ContributorQuery(getPillarID(), newestTimestamp.toGregorianCalendar().toInstant(), null, null); limitedChecksumList = pillarFileManager.getChecksums(null, query, null); Assertions.assertFalse(limitedChecksumList.isEmpty(), "Empty list returned when when minTimestamp is set to newest calculated checksum timestamp"); - Assertions.assertEquals(0, limitedChecksumList.get(0).getCalculationTimestamp().compare(newestTimestamp), + Assertions.assertEquals(0, limitedChecksumList.getFirst().getCalculationTimestamp().compare(newestTimestamp), "Different timestamps in the set of newest checksums." + limitedChecksumList); addStep("Request checksums with MinTimeStamp set to the timestamp of the newest checksum + 10 ms", "No checksums are returned."); GregorianCalendar newerThanNewestTimestamp = newestTimestamp.toGregorianCalendar(); newerThanNewestTimestamp.add(Calendar.MILLISECOND, 10); - query = new ContributorQuery(getPillarID(), newerThanNewestTimestamp.getTime(), null, null); + query = new ContributorQuery(getPillarID(), newerThanNewestTimestamp.toInstant(), null, null); limitedChecksumList = pillarFileManager.getChecksums(null, query, null); Assertions.assertTrue(limitedChecksumList.isEmpty(), "Non-empty checksum list returned with newerThanNewestTimestamp(" + @@ -169,48 +169,47 @@ void maxTimeStampTest() { "but the test needs this to be satisfied to make sense)."); List originalChecksumList = pillarFileManager.getChecksums(null, null, null); - Assertions.assertTrue(originalChecksumList.get(0).getCalculationTimestamp().compare( - originalChecksumList.get(originalChecksumList.size() - 1).getCalculationTimestamp()) != 0, + Assertions.assertTrue(originalChecksumList.getFirst().getCalculationTimestamp().compare( + originalChecksumList.getLast().getCalculationTimestamp()) != 0, "The timestamps of the first and last checksum are the same."); addStep("Request checksums with MaxTimeStamp set to the timestamp of the newest checksum", "All checksums should be returned."); XMLGregorianCalendar newestTimestamp = - originalChecksumList.get(originalChecksumList.size() - 1).getCalculationTimestamp(); + originalChecksumList.getLast().getCalculationTimestamp(); ContributorQuery query = new ContributorQuery(getPillarID(), - null, newestTimestamp.toGregorianCalendar().getTime(), null); + null, newestTimestamp.toGregorianCalendar().toInstant(), null); List limitedChecksumList = pillarFileManager.getChecksums(null, query, null); Assertions.assertEquals(originalChecksumList.size(), limitedChecksumList.size(), "Differing size of checksum lists"); - Assertions.assertEquals(originalChecksumList.get(0), limitedChecksumList.get(0), + Assertions.assertEquals(originalChecksumList.getFirst(), limitedChecksumList.getFirst(), "Different first list element when " + "setting newest maxTimestamp"); - Assertions.assertEquals(originalChecksumList.get(originalChecksumList.size() - 1), - limitedChecksumList.get(limitedChecksumList.size() - 1), + Assertions.assertEquals(originalChecksumList.getLast(), limitedChecksumList.getLast(), "Different last list element when setting " + "newest maxTimestamp"); - Assertions.assertTrue(limitedChecksumList.get(0).getCalculationTimestamp().compare( - limitedChecksumList.get(limitedChecksumList.size() - 1).getCalculationTimestamp()) <= 0, + Assertions.assertTrue(limitedChecksumList.getFirst().getCalculationTimestamp().compare( + limitedChecksumList.getLast().getCalculationTimestamp()) <= 0, "First checksum has newer timestamp than last checksum"); addStep("Request checksums with MaxTimeStamp set to the timestamp of the oldest checksum", "Only checksum with the timestamp equal to MaxTimeStamp are returned."); - XMLGregorianCalendar oldestTimestamp = originalChecksumList.get(0).getCalculationTimestamp(); + XMLGregorianCalendar oldestTimestamp = originalChecksumList.getFirst().getCalculationTimestamp(); query = new ContributorQuery(getPillarID(), - null, oldestTimestamp.toGregorianCalendar().getTime(), null); + null, oldestTimestamp.toGregorianCalendar().toInstant(), null); limitedChecksumList = pillarFileManager.getChecksums(null, query, null); Assertions.assertFalse(limitedChecksumList.isEmpty(), "At least one checksum with the oldest timestamp should be " + "returned."); - Assertions.assertEquals(0, limitedChecksumList.get(0).getCalculationTimestamp().compare(oldestTimestamp), + Assertions.assertEquals(0, limitedChecksumList.getFirst().getCalculationTimestamp().compare(oldestTimestamp), "Different timestamps in the set of oldest checksums." + limitedChecksumList); addStep("Request checksums with MaxTimeStamp set to the timestamp of the oldest checksum - 10 ms", "No checksums are returned."); GregorianCalendar olderThanOldestTimestamp = oldestTimestamp.toGregorianCalendar(); olderThanOldestTimestamp.add(Calendar.MILLISECOND, -10); - query = new ContributorQuery(getPillarID(), null, olderThanOldestTimestamp.getTime(), null); + query = new ContributorQuery(getPillarID(), null, olderThanOldestTimestamp.toInstant(), null); limitedChecksumList = pillarFileManager.getChecksums(null, query, null); Assertions.assertTrue(limitedChecksumList.isEmpty(), "Non-empty checksum list returned with olderThanOldestTimestamp(" + diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/IdentifyPillarsForGetChecksumsIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/IdentifyPillarsForGetChecksumsIT.java index 28f724bbf..a597009e2 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/IdentifyPillarsForGetChecksumsIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getchecksums/IdentifyPillarsForGetChecksumsIT.java @@ -31,7 +31,7 @@ import org.bitrepository.common.utils.ChecksumUtils; import org.bitrepository.common.utils.FileIDsUtils; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.DefaultPillarIdentificationTest; +import org.bitrepository.pillar.integration.func.DefaultPillarIdentificationIT; import org.bitrepository.pillar.messagefactories.GetChecksumsMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -41,7 +41,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class IdentifyPillarsForGetChecksumsIT extends DefaultPillarIdentificationTest { +class IdentifyPillarsForGetChecksumsIT extends DefaultPillarIdentificationIT { protected GetChecksumsMessageFactory msgFactory; @BeforeEach @@ -71,8 +71,7 @@ void normalIdentificationTest() { addStep("Retrieve and validate the response getPillarID() the pillar.", "The pillar should make a response."); - IdentifyPillarsForGetChecksumsResponse receivedIdentifyResponse = clientReceiver.waitForMessage( - IdentifyPillarsForGetChecksumsResponse.class); + IdentifyPillarsForGetChecksumsResponse receivedIdentifyResponse = receiveResponse(identifyRequest); Assertions.assertNotNull(receivedIdentifyResponse); Assertions.assertEquals(identifyRequest.getCollectionID(), receivedIdentifyResponse.getCollectionID(), "Received unexpected 'CollectionID' in response."); @@ -107,8 +106,7 @@ void nonExistingFileTest() { addStep("Retrieve and validate the response getPillarID() the pillar.", "The pillar should make a response."); - IdentifyPillarsForGetChecksumsResponse receivedIdentifyResponse = clientReceiver.waitForMessage( - IdentifyPillarsForGetChecksumsResponse.class); + IdentifyPillarsForGetChecksumsResponse receivedIdentifyResponse = receiveResponse(identifyRequest); Assertions.assertNotNull(receivedIdentifyResponse.getFileIDs().getFileID()); Assertions.assertEquals(ResponseCode.FILE_NOT_FOUND_FAILURE, receivedIdentifyResponse.getResponseInfo().getResponseCode(), @@ -132,22 +130,21 @@ void allFilesTest() { addStep("Retrieve and validate the response getPillarID() the pillar.", "The pillar should make a response."); - IdentifyPillarsForGetChecksumsResponse receivedIdentifyResponse = clientReceiver.waitForMessage( - IdentifyPillarsForGetChecksumsResponse.class); + IdentifyPillarsForGetChecksumsResponse receivedIdentifyResponse = receiveResponse(identifyRequest); Assertions.assertEquals(ResponseCode.IDENTIFICATION_POSITIVE, receivedIdentifyResponse.getResponseInfo().getResponseCode(), "Received unexpected 'ResponseCode' in response."); } @Override - protected MessageRequest createRequest() { + protected IdentifyPillarsForGetChecksumsRequest createRequest() { return msgFactory.createIdentifyPillarsForGetChecksumsRequest(ChecksumUtils.getDefault(settingsForCUT), FileIDsUtils.getAllFileIDs()); } @Override - protected MessageResponse receiveResponse() { - return clientReceiver.waitForMessage(IdentifyPillarsForGetChecksumsResponse.class); + protected IdentifyPillarsForGetChecksumsResponse receiveResponse(MessageRequest request) { + return clientReceiver.waitForMessage(IdentifyPillarsForGetChecksumsResponse.class, request.getCorrelationID()); } @Override diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfile/GetFileRequestIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfile/GetFileRequestIT.java index c5b841298..bae1f7fb1 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfile/GetFileRequestIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfile/GetFileRequestIT.java @@ -11,7 +11,7 @@ import org.bitrepository.bitrepositorymessages.MessageResponse; import org.bitrepository.common.utils.TestFileHelper; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.PillarFunctionTest; +import org.bitrepository.pillar.integration.func.PillarFunctionIT; import org.bitrepository.pillar.messagefactories.GetFileMessageFactory; import org.bitrepository.protocol.FileExchange; import org.bitrepository.protocol.ProtocolComponentFactory; @@ -35,7 +35,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class GetFileRequestIT extends PillarFunctionTest { +class GetFileRequestIT extends PillarFunctionIT { private final Logger log = LoggerFactory.getLogger(this.getClass()); protected GetFileMessageFactory msgFactory; protected URL testFileURL = null; @@ -77,10 +77,10 @@ void normalGetFileTest() throws IOException { "
  • 'ResponseInfo.ResponseCode' element should be OPERATION_COMPLETED
  • " + ""); - GetFileRequest getRequest = (GetFileRequest) createRequest(); + GetFileRequest getRequest = createRequest(); messageBus.sendMessage(getRequest); - GetFileFinalResponse finalResponse = (GetFileFinalResponse) receiveResponse(); + GetFileFinalResponse finalResponse = receiveResponse(getRequest); Assertions.assertNotNull(finalResponse); Assertions.assertEquals(getRequest.getCorrelationID(), finalResponse.getCorrelationID(), "Received unexpected " + @@ -123,7 +123,7 @@ void getFileWithFilePartTest() throws IOException { addStep("Send a getFile request to " + testConfiguration.getPillarUnderTestID() + " with a specified " + "FilePart", "The pillar should send a final response with the FilePart element for the supplied file"); - GetFileRequest getRequest = (GetFileRequest) createRequest(); + GetFileRequest getRequest = createRequest(); final int offsetAndLength = 5; FilePart filePart = new FilePart(); @@ -132,7 +132,7 @@ void getFileWithFilePartTest() throws IOException { getRequest.setFilePart(filePart); messageBus.sendMessage(getRequest); - GetFileFinalResponse finalResponse = (GetFileFinalResponse) receiveResponse(); + GetFileFinalResponse finalResponse = receiveResponse(getRequest); Assertions.assertEquals(getRequest.getFilePart(), finalResponse.getFilePart(), "Received unexpected 'FilePart' element."); @@ -154,11 +154,11 @@ void getMissingFileTest() { addStep("Send a getFile request to " + testConfiguration.getPillarUnderTestID() + " with a " + "non-existing fileID", "The pillar should send a failure response"); - GetFileRequest getRequest = (GetFileRequest) createRequest(); + GetFileRequest getRequest = createRequest(); getRequest.setFileID("NonExistingFile"); messageBus.sendMessage(getRequest); - GetFileFinalResponse finalResponse = (GetFileFinalResponse) receiveResponse(); + GetFileFinalResponse finalResponse = receiveResponse(getRequest); Assertions.assertEquals(ResponseCode.FILE_NOT_FOUND_FAILURE, finalResponse.getResponseInfo().getResponseCode(), "Received unexpected 'ResponseCode' element."); } @@ -169,11 +169,11 @@ void missingCollectionIDTest() { addDescription("Verifies the a missing collectionID in the request is rejected"); addStep("Sending a request without a collectionID.", "The pillar should send a REQUEST_NOT_UNDERSTOOD_FAILURE Response."); - MessageRequest request = createRequest(); + GetFileRequest request = createRequest(); request.setCollectionID(null); messageBus.sendMessage(request); - MessageResponse receivedResponse = receiveResponse(); + MessageResponse receivedResponse = receiveResponse(request); Assertions.assertEquals(ResponseCode.REQUEST_NOT_UNDERSTOOD_FAILURE, receivedResponse.getResponseInfo().getResponseCode()); } @@ -188,16 +188,16 @@ void otherCollectionTest() { MessageRequest request = createRequest(); request.setCollectionID(nonDefaultCollectionId); messageBus.sendMessage(request); - assertPositivResponseIsReceived(); + assertPositivResponseIsReceived(request); } - protected MessageRequest createRequest() { + protected GetFileRequest createRequest() { return msgFactory.createGetFileRequest(testFileURL.toExternalForm(), defaultFileId); } - protected MessageResponse receiveResponse() { + protected GetFileFinalResponse receiveResponse(final MessageRequest request) { return clientReceiver.waitForMessage(GetFileFinalResponse.class, getOperationTimeout(), - TimeUnit.SECONDS); + TimeUnit.SECONDS, request.getCorrelationID()); } protected void assertNoResponseIsReceived() { @@ -213,8 +213,8 @@ public String lookupGetFileDestination() { return clientReceiver.waitForMessage(IdentifyPillarsForGetFileResponse.class).getReplyTo(); } - protected void assertPositivResponseIsReceived() { - MessageResponse receivedResponse = receiveResponse(); + protected void assertPositivResponseIsReceived(final MessageRequest request) { + MessageResponse receivedResponse = receiveResponse(request); Assertions.assertEquals(ResponseCode.OPERATION_COMPLETED, receivedResponse.getResponseInfo().getResponseCode()); } } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfile/IdentifyPillarsForGetFileIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfile/IdentifyPillarsForGetFileIT.java index 94403fc65..7909c52c8 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfile/IdentifyPillarsForGetFileIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfile/IdentifyPillarsForGetFileIT.java @@ -25,7 +25,7 @@ import org.bitrepository.bitrepositorymessages.IdentifyPillarsForGetFileRequest; import org.bitrepository.bitrepositorymessages.IdentifyPillarsForGetFileResponse; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.PillarFunctionTest; +import org.bitrepository.pillar.integration.func.PillarFunctionIT; import org.bitrepository.pillar.messagefactories.GetFileMessageFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -35,7 +35,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; import static org.junit.jupiter.api.Assertions.assertEquals; -class IdentifyPillarsForGetFileIT extends PillarFunctionTest { +class IdentifyPillarsForGetFileIT extends PillarFunctionIT { protected GetFileMessageFactory msgFactory; @BeforeEach diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsIT.java similarity index 89% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsIT.java index 6874d0324..6125710d3 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsIT.java @@ -27,12 +27,12 @@ import org.bitrepository.bitrepositorymessages.GetFileIDsFinalResponse; import org.bitrepository.bitrepositorymessages.GetFileIDsProgressResponse; import org.bitrepository.bitrepositorymessages.GetFileIDsRequest; +import org.bitrepository.bitrepositorymessages.IdentifyPillarsForGetFileIDsRequest; import org.bitrepository.bitrepositorymessages.IdentifyPillarsForGetFileIDsResponse; import org.bitrepository.bitrepositorymessages.MessageRequest; -import org.bitrepository.bitrepositorymessages.MessageResponse; import org.bitrepository.common.utils.FileIDsUtils; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.DefaultPillarOperationTest; +import org.bitrepository.pillar.integration.func.DefaultPillarOperationIT; import org.bitrepository.pillar.messagefactories.GetFileIDsMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -46,7 +46,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -class GetFileIDsTest extends DefaultPillarOperationTest { +class GetFileIDsIT extends DefaultPillarOperationIT { protected GetFileIDsMessageFactory msgFactory; private String pillarDestination; @@ -76,7 +76,7 @@ void pillarGetFileIDsTestSuccessCase() throws Exception { addStep("Retrieve the ProgressResponse for the GetFileIDs request", "A GetFileIDs progress response should be sent to the client with correct attributes."); GetFileIDsProgressResponse progressResponse = clientReceiver.waitForMessage(GetFileIDsProgressResponse.class, - getOperationTimeout(), TimeUnit.SECONDS); + getOperationTimeout(), TimeUnit.SECONDS, getFileIDsRequest.getCorrelationID()); Assertions.assertNotNull(progressResponse); Assertions.assertEquals(getFileIDsRequest.getCorrelationID(), progressResponse.getCorrelationID()); Assertions.assertEquals(getFileIDsRequest.getFileIDs(), progressResponse.getFileIDs()); @@ -88,7 +88,7 @@ void pillarGetFileIDsTestSuccessCase() throws Exception { addStep("Retrieve the FinalResponse for the GetFileIDs request", "The GetFileIDs response should be sent by the pillar."); - GetFileIDsFinalResponse finalResponse = (GetFileIDsFinalResponse) receiveResponse(); + GetFileIDsFinalResponse finalResponse = receiveResponse(getFileIDsRequest); Assertions.assertNotNull(finalResponse); Assertions.assertEquals(ResponseCode.OPERATION_COMPLETED, finalResponse.getResponseInfo().getResponseCode()); Assertions.assertEquals(getFileIDsRequest.getCorrelationID(), finalResponse.getCorrelationID()); @@ -117,7 +117,7 @@ void pillarGetFileIDsTestFailedNoSuchFileInOperation() throws Exception { "A FILE_NOT_FOUND_FAILURE response should be generated."); GetFileIDsRequest getFileIDsRequest = msgFactory.createGetFileIDsRequest(fileids, null); messageBus.sendMessage(getFileIDsRequest); - GetFileIDsFinalResponse finalResponse = (GetFileIDsFinalResponse) receiveResponse(); + GetFileIDsFinalResponse finalResponse = receiveResponse(getFileIDsRequest); Assertions.assertEquals(ResponseCode.FILE_NOT_FOUND_FAILURE, finalResponse.getResponseInfo().getResponseCode()); } @@ -137,7 +137,7 @@ void pillarGetFileIDsSpecificFileIDRequest() throws Exception { addStep("Retrieve the FinalResponse for the GetFileIDs request.", "A OPERATION_COMPLETE final response only containing the requested file-id."); - GetFileIDsFinalResponse finalResponse = (GetFileIDsFinalResponse) receiveResponse(); + GetFileIDsFinalResponse finalResponse = receiveResponse(getFileIDsRequest); Assertions.assertEquals(1, finalResponse.getResultingFileIDs().getFileIDsData().getFileIDsDataItems().getFileIDsDataItem().size()); Assertions.assertEquals(defaultFileId, @@ -151,14 +151,14 @@ void pillarGetFileIDsSpecificFileIDRequest() throws Exception { @Tag(PillarTestGroups.CHECKSUM_PILLAR_TEST) void pillarGetFileIDsTestBadDeliveryURL() throws Exception { addDescription("Test the case when the delivery URL is unaccessible."); - String badURL = "http://localhost:61616/¾"; + String badURL = "http://localhost:54321/¾"; GetFileIDsRequest getFileIDsRequest = msgFactory.createGetFileIDsRequest( FileIDsUtils.getAllFileIDs(), badURL); messageBus.sendMessage(getFileIDsRequest); addStep("Retrieve the FinalResponse for the GetFileIDs request.", "A FILE_TRANSFER_FAILURE final response is expected."); - GetFileIDsFinalResponse finalResponse = (GetFileIDsFinalResponse) receiveResponse(); + GetFileIDsFinalResponse finalResponse = receiveResponse(getFileIDsRequest); Assertions.assertEquals(ResponseCode.FILE_TRANSFER_FAILURE, finalResponse.getResponseInfo().getResponseCode()); } @@ -174,7 +174,7 @@ void pillarGetFileIDsTestDeliveryThroughUpload() throws Exception { addStep("Retrieve the FinalResponse for the GetFileIDs request.", "A OPERATION_COMPLETE final response is expected containing the result provided address."); - GetFileIDsFinalResponse finalResponse = (GetFileIDsFinalResponse) receiveResponse(); + GetFileIDsFinalResponse finalResponse = receiveResponse(getFileIDsRequest); Assertions.assertEquals(ResponseCode.OPERATION_COMPLETED, finalResponse.getResponseInfo().getResponseCode()); Assertions.assertEquals(defaultUploadFileAddress, finalResponse.getResultingFileIDs().getResultAddress()); } @@ -185,9 +185,9 @@ protected MessageRequest createRequest() { } @Override - protected MessageResponse receiveResponse() { + protected GetFileIDsFinalResponse receiveResponse(MessageRequest request) { return clientReceiver.waitForMessage(GetFileIDsFinalResponse.class, getOperationTimeout(), - TimeUnit.SECONDS); + TimeUnit.SECONDS, request.getCorrelationID()); } protected void assertNoResponseIsReceived() { @@ -195,7 +195,8 @@ protected void assertNoResponseIsReceived() { } public String lookupPillarDestination() { - messageBus.sendMessage(msgFactory.createIdentifyPillarsForGetFileIDsRequest(null)); - return clientReceiver.waitForMessage(IdentifyPillarsForGetFileIDsResponse.class).getReplyTo(); + IdentifyPillarsForGetFileIDsRequest identifyPillarsForGetFileIDsRequest = msgFactory.createIdentifyPillarsForGetFileIDsRequest(null); + messageBus.sendMessage(identifyPillarsForGetFileIDsRequest); + return clientReceiver.waitForMessage(IdentifyPillarsForGetFileIDsResponse.class, identifyPillarsForGetFileIDsRequest.getCorrelationID()).getReplyTo(); } } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsQueryTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsQueryIT.java similarity index 87% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsQueryTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsQueryIT.java index dc8536aad..a34b581f3 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsQueryTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/GetFileIDsQueryIT.java @@ -26,7 +26,7 @@ import org.bitrepository.common.utils.CalendarUtils; import org.bitrepository.pillar.PillarTestGroups; import org.bitrepository.pillar.integration.func.Assert; -import org.bitrepository.pillar.integration.func.PillarFunctionTest; +import org.bitrepository.pillar.integration.func.PillarFunctionIT; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -41,7 +41,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addFixture; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class GetFileIDsQueryTest extends PillarFunctionTest { +class GetFileIDsQueryIT extends PillarFunctionIT { @Test @Tag(PillarTestGroups.FULL_PILLAR_TEST) @@ -86,7 +86,7 @@ void maxNumberOfResultTest() { ContributorQuery singleFileIDQuery = new ContributorQuery(getPillarID(), (Instant) null, (Instant) null, 1); List singleFileIDList = pillarFileManager.getFileIDs(singleFileIDQuery); Assertions.assertEquals(1, singleFileIDList.size(), "The result didn't contain a single file id"); - Assertions.assertEquals(originalFileIDsList.get(0), singleFileIDList.get(0), + Assertions.assertEquals(originalFileIDsList.getFirst(), singleFileIDList.getFirst(), "The returned file id wasn't equal to the oldest file id"); } @@ -104,15 +104,15 @@ void minTimeStampTest() { List originalFileIDsList = pillarFileManager.getFileIDs(null); Assertions.assertTrue(originalFileIDsList.size() >= 2, "Must initially have at least two file ids, but had: " + originalFileIDsList.size()); - Assertions.assertTrue(originalFileIDsList.get(0).getLastModificationTime().compare( - originalFileIDsList.get(originalFileIDsList.size() - 1).getLastModificationTime()) != 0, + Assertions.assertTrue(originalFileIDsList.getFirst().getLastModificationTime().compare( + originalFileIDsList.getLast().getLastModificationTime()) != 0, "The timestamps of the first and last file id are the same."); addStep("Request file ids with MinTimeStamp set to the timestamp of the oldest file id", "All file ids should be returned."); - XMLGregorianCalendar oldestTimestamp = originalFileIDsList.get(0).getLastModificationTime(); + XMLGregorianCalendar oldestTimestamp = originalFileIDsList.getFirst().getLastModificationTime(); ContributorQuery query = new ContributorQuery(getPillarID(), - oldestTimestamp.toGregorianCalendar().getTime(), null, null); + oldestTimestamp.toGregorianCalendar().toInstant(), null, null); List limitedFileIDsList = pillarFileManager.getFileIDs(query); Assertions.assertEquals(originalFileIDsList, limitedFileIDsList, "Different list return when setting old minTimestamp: " @@ -121,21 +121,21 @@ void minTimeStampTest() { addStep("Request file ids with MinTimeStamp set to the timestamp of the newest file id", "Only file id with the timestamp equal to MinTimeStamp are returned."); XMLGregorianCalendar newestTimestamp = - originalFileIDsList.get(originalFileIDsList.size() - 1).getLastModificationTime(); + originalFileIDsList.getLast().getLastModificationTime(); query = new ContributorQuery(getPillarID(), - newestTimestamp.toGregorianCalendar().getTime(), null, null); + newestTimestamp.toGregorianCalendar().toInstant(), null, null); limitedFileIDsList = pillarFileManager.getFileIDs(query); Assertions.assertFalse(limitedFileIDsList.isEmpty(), "Empty list returned when when minTimestamp is set to newest " + "calculated checksum timestamp"); - Assertions.assertEquals(0, limitedFileIDsList.get(0).getLastModificationTime().compare(newestTimestamp), + Assertions.assertEquals(0, limitedFileIDsList.getFirst().getLastModificationTime().compare(newestTimestamp), "Different timestamps in the set of newest file ids." + limitedFileIDsList); addStep("Request file ids with MinTimeStamp set to the timestamp of the newest file id + 10 ms", "No file ids are returned."); GregorianCalendar newerThanNewestTimestamp = newestTimestamp.toGregorianCalendar(); newerThanNewestTimestamp.add(Calendar.MILLISECOND, 10); - query = new ContributorQuery(getPillarID(), newerThanNewestTimestamp.getTime(), null, null); + query = new ContributorQuery(getPillarID(), newerThanNewestTimestamp.toInstant(), null, null); limitedFileIDsList = pillarFileManager.getFileIDs(query); Assert.assertEmpty(limitedFileIDsList, "Non-empty list returned with olderThanOldestTimestamp(" + CalendarUtils.getXmlGregorianCalendar(newerThanNewestTimestamp) + ") query"); @@ -155,37 +155,37 @@ void maxTimeStampTest() { List originalFileIDsList = pillarFileManager.getFileIDs(null); Assertions.assertTrue(originalFileIDsList.size() >= 2, "Must initially have at least two file ids, but had: " + originalFileIDsList.size()); - Assertions.assertTrue(originalFileIDsList.get(0).getLastModificationTime().compare( - originalFileIDsList.get(originalFileIDsList.size() - 1).getLastModificationTime()) != 0, + Assertions.assertTrue(originalFileIDsList.getFirst().getLastModificationTime().compare( + originalFileIDsList.getLast().getLastModificationTime()) != 0, "The timestamps of the first and last file id are the same."); addStep("Request file ids with MaxTimeStamp set to the timestamp of the newest file id", "All file ids should be returned."); XMLGregorianCalendar newestTimestamp = - originalFileIDsList.get(originalFileIDsList.size() - 1).getLastModificationTime(); + originalFileIDsList.getLast().getLastModificationTime(); ContributorQuery query = new ContributorQuery(getPillarID(), - null, newestTimestamp.toGregorianCalendar().getTime(), null); + null, newestTimestamp.toGregorianCalendar().toInstant(), null); List limitedFileIDsList = pillarFileManager.getFileIDs(query); Assertions.assertEquals(originalFileIDsList, limitedFileIDsList, "Different list return when setting newest maxTimestamp"); addStep("Request file ids with MaxTimeStamp set to the timestamp of the oldest file id", "Only file id with the timestamp equal to MaxTimeStamp are returned."); - XMLGregorianCalendar oldestTimestamp = originalFileIDsList.get(0).getLastModificationTime(); + XMLGregorianCalendar oldestTimestamp = originalFileIDsList.getFirst().getLastModificationTime(); query = new ContributorQuery(getPillarID(), - null, oldestTimestamp.toGregorianCalendar().getTime(), null); + null, oldestTimestamp.toGregorianCalendar().toInstant(), null); limitedFileIDsList = pillarFileManager.getFileIDs(query); Assertions.assertFalse(limitedFileIDsList.isEmpty(), "At least one file id with the oldest timestamp should be " + "returned. The folliwing fileIDs where received: "); - Assertions.assertEquals(0, limitedFileIDsList.get(0).getLastModificationTime().compare(oldestTimestamp), + Assertions.assertEquals(0, limitedFileIDsList.getFirst().getLastModificationTime().compare(oldestTimestamp), "Different timestamps in the set of oldest file ids." + limitedFileIDsList); addStep("Request file ids with MaxTimeStamp set to the timestamp of the oldest file id - 10 ms", "No file ids are returned."); GregorianCalendar olderThanOldestTimestamp = oldestTimestamp.toGregorianCalendar(); olderThanOldestTimestamp.add(Calendar.MILLISECOND, -10); - query = new ContributorQuery(getPillarID(), null, olderThanOldestTimestamp.getTime(), null); + query = new ContributorQuery(getPillarID(), null, olderThanOldestTimestamp.toInstant(), null); limitedFileIDsList = pillarFileManager.getFileIDs(query); Assert.assertEmpty(limitedFileIDsList, "Non-empty list returned with olderThanOldestTimestamp(" + CalendarUtils.getXmlGregorianCalendar(olderThanOldestTimestamp) + ") query"); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/IdentifyPillarsForGetFileIDsIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/IdentifyPillarsForGetFileIDsIT.java index 5640c41f9..a987d8018 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/IdentifyPillarsForGetFileIDsIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getfileids/IdentifyPillarsForGetFileIDsIT.java @@ -29,7 +29,7 @@ import org.bitrepository.bitrepositorymessages.MessageResponse; import org.bitrepository.common.utils.FileIDsUtils; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.DefaultPillarIdentificationTest; +import org.bitrepository.pillar.integration.func.DefaultPillarIdentificationIT; import org.bitrepository.pillar.messagefactories.GetFileIDsMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -39,7 +39,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class IdentifyPillarsForGetFileIDsIT extends DefaultPillarIdentificationTest { +class IdentifyPillarsForGetFileIDsIT extends DefaultPillarIdentificationIT { protected GetFileIDsMessageFactory msgFactory; @BeforeEach @@ -137,13 +137,13 @@ void allFilesTest() { } @Override - protected MessageRequest createRequest() { + protected IdentifyPillarsForGetFileIDsRequest createRequest() { return msgFactory.createIdentifyPillarsForGetFileIDsRequest(null); } @Override - protected MessageResponse receiveResponse() { - return clientReceiver.waitForMessage(IdentifyPillarsForGetFileIDsResponse.class); + protected IdentifyPillarsForGetFileIDsResponse receiveResponse(MessageRequest request) { + return clientReceiver.waitForMessage(IdentifyPillarsForGetFileIDsResponse.class, request.getCorrelationID()); } @Override diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getstatus/GetStatusRequestIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getstatus/GetStatusRequestIT.java index 2555db86e..c1ec48bf0 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getstatus/GetStatusRequestIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getstatus/GetStatusRequestIT.java @@ -29,7 +29,7 @@ import org.bitrepository.bitrepositorymessages.IdentifyContributorsForGetStatusRequest; import org.bitrepository.bitrepositorymessages.IdentifyContributorsForGetStatusResponse; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.PillarFunctionTest; +import org.bitrepository.pillar.integration.func.PillarFunctionIT; import org.bitrepository.pillar.messagefactories.GetStatusMessageFactory; import org.bitrepository.settings.referencesettings.AlarmLevel; import org.junit.jupiter.api.Assertions; @@ -40,7 +40,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class GetStatusRequestIT extends PillarFunctionTest { +class GetStatusRequestIT extends PillarFunctionIT { protected GetStatusMessageFactory msgFactory; private String pillarDestination; diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getstatus/IdentifyContributorsForGetStatusIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getstatus/IdentifyContributorsForGetStatusIT.java index e2a900ae7..956e3cfad 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getstatus/IdentifyContributorsForGetStatusIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/getstatus/IdentifyContributorsForGetStatusIT.java @@ -26,7 +26,7 @@ import org.bitrepository.bitrepositorymessages.IdentifyContributorsForGetStatusRequest; import org.bitrepository.bitrepositorymessages.IdentifyContributorsForGetStatusResponse; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.PillarFunctionTest; +import org.bitrepository.pillar.integration.func.PillarFunctionIT; import org.bitrepository.pillar.messagefactories.GetStatusMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -36,7 +36,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class IdentifyContributorsForGetStatusIT extends PillarFunctionTest { +class IdentifyContributorsForGetStatusIT extends PillarFunctionIT { protected GetStatusMessageFactory msgFactory; @BeforeEach diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/multicollection/MultipleCollectionIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/multicollection/MultipleCollectionIT.java index 301130b06..d3dba9576 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/multicollection/MultipleCollectionIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/multicollection/MultipleCollectionIT.java @@ -25,7 +25,7 @@ import org.bitrepository.client.exceptions.NegativeResponseException; import org.bitrepository.common.utils.TestFileHelper; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.PillarIntegrationTest; +import org.bitrepository.pillar.integration.PillarIntegrationIT; import org.bitrepository.protocol.bus.MessageReceiver; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; @@ -38,7 +38,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -public class MultipleCollectionIT extends PillarIntegrationTest { +public class MultipleCollectionIT extends PillarIntegrationIT { /** * Used for receiving responses from the pillar */ @@ -78,8 +78,7 @@ public void fileInOtherCollectionTest() throws Exception { protected void registerMessageReceivers() { super.registerMessageReceivers(); - clientReceiver = new MessageReceiver(settingsForTestClient.getReceiverDestinationID()); - addReceiver(clientReceiver); + clientReceiver = addReceiver(new MessageReceiver(settingsForTestClient.getReceiverDestinationID())); Collection pillarFilter = Collections.singletonList(testConfiguration.getPillarUnderTestID()); clientReceiver.setFromFilter(pillarFilter); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/putfile/IdentifyPillarsForPutFileIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/putfile/IdentifyPillarsForPutFileIT.java index 7249c4fba..5a5e311cc 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/putfile/IdentifyPillarsForPutFileIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/putfile/IdentifyPillarsForPutFileIT.java @@ -27,7 +27,7 @@ import org.bitrepository.bitrepositorymessages.MessageRequest; import org.bitrepository.bitrepositorymessages.MessageResponse; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.DefaultPillarIdentificationTest; +import org.bitrepository.pillar.integration.func.DefaultPillarIdentificationIT; import org.bitrepository.pillar.messagefactories.PutFileMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -37,7 +37,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class IdentifyPillarsForPutFileIT extends DefaultPillarIdentificationTest { +class IdentifyPillarsForPutFileIT extends DefaultPillarIdentificationIT { protected PutFileMessageFactory msgFactory; @BeforeEach @@ -62,11 +62,11 @@ void normalIdentificationTest() { "
  • 'ResponseInfo.ResponseCode' element should be IDENTIFICATION_POSITIVE
  • " + ""); IdentifyPillarsForPutFileRequest identifyRequest = msgFactory.createIdentifyPillarsForPutFileRequest( - nonDefaultFileId, 0L); + nonDefaultFileId, 0L); messageBus.sendMessage(identifyRequest); - IdentifyPillarsForPutFileResponse receivedIdentifyResponse = clientReceiver.waitForMessage( - IdentifyPillarsForPutFileResponse.class); + IdentifyPillarsForPutFileResponse receivedIdentifyResponse = receiveResponse(identifyRequest); + Assertions.assertEquals(identifyRequest.getCollectionID(), receivedIdentifyResponse.getCollectionID(), "Received unexpected CollectionID"); Assertions.assertEquals(identifyRequest.getCorrelationID(), receivedIdentifyResponse.getCorrelationID(), @@ -100,8 +100,7 @@ void identificationTestForChecksumPillar() { nonDefaultFileId, 0L); messageBus.sendMessage(identifyRequest); - IdentifyPillarsForPutFileResponse receivedIdentifyResponse = clientReceiver.waitForMessage( - IdentifyPillarsForPutFileResponse.class); + IdentifyPillarsForPutFileResponse receivedIdentifyResponse = receiveResponse(identifyRequest); Assertions.assertEquals(identifyRequest.getCollectionID(), receivedIdentifyResponse.getCollectionID()); Assertions.assertEquals(identifyRequest.getCorrelationID(), receivedIdentifyResponse.getCorrelationID()); Assertions.assertEquals(getPillarID(), receivedIdentifyResponse.getFrom()); @@ -127,20 +126,18 @@ void fileExistsTest() { defaultFileId, 0L); messageBus.sendMessage(identifyRequest); - IdentifyPillarsForPutFileResponse receivedIdentifyResponse = clientReceiver.waitForMessage( - IdentifyPillarsForPutFileResponse.class); + IdentifyPillarsForPutFileResponse receivedIdentifyResponse = receiveResponse(identifyRequest); Assertions.assertEquals(ResponseCode.DUPLICATE_FILE_FAILURE, receivedIdentifyResponse.getResponseInfo().getResponseCode()); } @Override - protected MessageRequest createRequest() { - return msgFactory.createIdentifyPillarsForPutFileRequest( - nonDefaultFileId, 0L); + protected IdentifyPillarsForPutFileRequest createRequest() { + return msgFactory.createIdentifyPillarsForPutFileRequest(nonDefaultFileId, 0L); } @Override - protected MessageResponse receiveResponse() { - return clientReceiver.waitForMessage(IdentifyPillarsForPutFileResponse.class); + protected IdentifyPillarsForPutFileResponse receiveResponse(MessageRequest request) { + return clientReceiver.waitForMessage(IdentifyPillarsForPutFileResponse.class, request.getCorrelationID()); } @Override diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/putfile/PutFileRequestIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/putfile/PutFileRequestIT.java index f3cd4417b..be07b85a6 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/putfile/PutFileRequestIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/putfile/PutFileRequestIT.java @@ -32,7 +32,7 @@ import org.bitrepository.common.utils.ChecksumUtils; import org.bitrepository.common.utils.TestFileHelper; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.DefaultPillarOperationTest; +import org.bitrepository.pillar.integration.func.DefaultPillarOperationIT; import org.bitrepository.pillar.messagefactories.PutFileMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -44,7 +44,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class PutFileRequestIT extends DefaultPillarOperationTest { +class PutFileRequestIT extends DefaultPillarOperationIT { protected PutFileMessageFactory msgFactory; private String pillarDestination; @@ -78,7 +78,7 @@ void normalPutFileTest() { DEFAULT_FILE_SIZE); messageBus.sendMessage(putRequest); - PutFileFinalResponse finalResponse = (PutFileFinalResponse) receiveResponse(); + PutFileFinalResponse finalResponse = receiveResponse(putRequest); Assertions.assertNotNull(finalResponse); Assertions.assertEquals(putRequest.getCorrelationID(), finalResponse.getCorrelationID(), "Received unexpected 'CorrelationID' element."); @@ -117,7 +117,7 @@ void putFileWithMD5ReturnChecksumTest() { putRequest.setChecksumRequestForNewFile(ChecksumUtils.getDefault(settingsForTestClient)); messageBus.sendMessage(putRequest); - PutFileFinalResponse finalResponse = (PutFileFinalResponse) receiveResponse(); + PutFileFinalResponse finalResponse = receiveResponse(putRequest); Assertions.assertArrayEquals(TestFileHelper.getDefaultFileChecksum().getChecksumValue(), finalResponse.getChecksumDataForNewFile().getChecksumValue(), "Return MD5 checksum was not equals to checksum for default file."); @@ -142,11 +142,11 @@ void putFileOperationAcceptedProgressTest() { "
  • 'FileAddress' element corresponding to the supplied FileAddress
  • " + "
  • 'ResponseInfo.ResponseCode' element should be OPERATION_ACCEPTED_PROGRESS
  • " + ""); - PutFileRequest putRequest = (PutFileRequest) createRequest(); + PutFileRequest putRequest = createRequest(); messageBus.sendMessage(putRequest); PutFileProgressResponse progressResponse = clientReceiver.waitForMessage(PutFileProgressResponse.class, - getOperationTimeout(), TimeUnit.SECONDS); + getOperationTimeout(), TimeUnit.SECONDS, putRequest.getCorrelationID()); Assertions.assertNotNull(progressResponse); Assertions.assertEquals(putRequest.getCorrelationID(), progressResponse.getCorrelationID(), "Received unexpected 'CorrelationID' element."); @@ -170,15 +170,15 @@ void putFileOperationAcceptedProgressTest() { } @Override - protected MessageRequest createRequest() { + protected PutFileRequest createRequest() { return msgFactory.createPutFileRequest(TestFileHelper.getDefaultFileChecksum(), null, defaultDownloadFileAddress, nonDefaultFileId, DEFAULT_FILE_SIZE); } @Override - protected MessageResponse receiveResponse() { + protected PutFileFinalResponse receiveResponse(MessageRequest request) { return clientReceiver.waitForMessage(PutFileFinalResponse.class, getOperationTimeout(), - TimeUnit.SECONDS); + TimeUnit.SECONDS, request.getCorrelationID()); } protected void assertNoResponseIsReceived() { diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/replacefile/IdentifyPillarsForReplaceFileIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/replacefile/IdentifyPillarsForReplaceFileIT.java index 56626ff22..105a2caee 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/replacefile/IdentifyPillarsForReplaceFileIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/replacefile/IdentifyPillarsForReplaceFileIT.java @@ -27,7 +27,7 @@ import org.bitrepository.bitrepositorymessages.MessageRequest; import org.bitrepository.bitrepositorymessages.MessageResponse; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.DefaultPillarIdentificationTest; +import org.bitrepository.pillar.integration.func.DefaultPillarIdentificationIT; import org.bitrepository.pillar.messagefactories.ReplaceFileMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -37,7 +37,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class IdentifyPillarsForReplaceFileIT extends DefaultPillarIdentificationTest { +class IdentifyPillarsForReplaceFileIT extends DefaultPillarIdentificationIT { protected ReplaceFileMessageFactory msgFactory; @BeforeEach @@ -114,8 +114,8 @@ protected MessageRequest createRequest() { } @Override - protected MessageResponse receiveResponse() { - return clientReceiver.waitForMessage(IdentifyPillarsForReplaceFileResponse.class); + protected MessageResponse receiveResponse(MessageRequest request) { + return clientReceiver.waitForMessage(IdentifyPillarsForReplaceFileResponse.class, request.getCorrelationID()); } @Override diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/replacefile/ReplaceFileRequestIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/replacefile/ReplaceFileRequestIT.java index 6372f216f..3b7bf50fb 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/replacefile/ReplaceFileRequestIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/func/replacefile/ReplaceFileRequestIT.java @@ -31,7 +31,7 @@ import org.bitrepository.bitrepositorymessages.ReplaceFileRequest; import org.bitrepository.common.utils.TestFileHelper; import org.bitrepository.pillar.PillarTestGroups; -import org.bitrepository.pillar.integration.func.DefaultPillarOperationTest; +import org.bitrepository.pillar.integration.func.DefaultPillarOperationIT; import org.bitrepository.pillar.messagefactories.ReplaceFileMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -43,7 +43,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class ReplaceFileRequestIT extends DefaultPillarOperationTest { +class ReplaceFileRequestIT extends DefaultPillarOperationIT { protected ReplaceFileMessageFactory msgFactory; private String pillarDestination; @@ -73,14 +73,14 @@ void normalReplaceFileTest() { messageBus.sendMessage(replaceRequest); ReplaceFileProgressResponse progressResponse = clientReceiver.waitForMessage(ReplaceFileProgressResponse.class, - getOperationTimeout(), TimeUnit.SECONDS); + getOperationTimeout(), TimeUnit.SECONDS, replaceRequest.getCorrelationID()); Assertions.assertNotNull(progressResponse); Assertions.assertEquals(replaceRequest.getCorrelationID(), progressResponse.getCorrelationID()); Assertions.assertEquals(getPillarID(), progressResponse.getFrom()); Assertions.assertEquals(getPillarID(), progressResponse.getPillarID()); Assertions.assertEquals(ResponseCode.OPERATION_ACCEPTED_PROGRESS, progressResponse.getResponseInfo().getResponseCode()); - ReplaceFileFinalResponse finalResponse = (ReplaceFileFinalResponse) receiveResponse(); + ReplaceFileFinalResponse finalResponse = receiveResponse(replaceRequest); Assertions.assertNotNull(finalResponse); Assertions.assertEquals(ResponseCode.OPERATION_COMPLETED, finalResponse.getResponseInfo().getResponseCode()); Assertions.assertEquals(replaceRequest.getCorrelationID(), finalResponse.getCorrelationID()); @@ -98,9 +98,9 @@ protected MessageRequest createRequest() { } @Override - protected MessageResponse receiveResponse() { + protected ReplaceFileFinalResponse receiveResponse(MessageRequest request) { return clientReceiver.waitForMessage(ReplaceFileFinalResponse.class, getOperationTimeout(), - TimeUnit.SECONDS); + TimeUnit.SECONDS, request.getCorrelationID()); } protected void assertNoResponseIsReceived() { @@ -113,6 +113,6 @@ public String lookupReplaceFileDestination() { IdentifyPillarsForReplaceFileRequest identifyRequest = replaceLookupMessageFactory.createIdentifyPillarsForReplaceFileRequest( TestFileHelper.DEFAULT_FILE_ID, 0L); messageBus.sendMessage(identifyRequest); - return clientReceiver.waitForMessage(IdentifyPillarsForReplaceFileResponse.class).getReplyTo(); + return clientReceiver.waitForMessage(IdentifyPillarsForReplaceFileResponse.class, identifyRequest.getCorrelationID()).getReplyTo(); } } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/GetAuditTrailsFileStressIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/GetAuditTrailsFileStressIT.java index 75f2ed4e8..a4efca713 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/GetAuditTrailsFileStressIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/GetAuditTrailsFileStressIT.java @@ -29,17 +29,17 @@ import org.bitrepository.modify.ModifyComponentFactory; import org.bitrepository.modify.putfile.BlockingPutFileClient; import org.bitrepository.modify.putfile.PutFileClient; +import org.bitrepository.pillar.PillarTestGroups; import org.bitrepository.pillar.integration.perf.metrics.Metrics; import org.bitrepository.protocol.security.DummySecurityManager; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class GetAuditTrailsFileStressIT extends PillarPerformanceTest { +class GetAuditTrailsFileStressIT extends PillarPerformanceIT { protected AuditTrailClient auditTrailClient; PutFileClient putClient; @@ -48,7 +48,7 @@ void initialiseReferenceTest() throws Exception { putClient = ModifyComponentFactory.getInstance().retrievePutClient( settingsForTestClient, createSecurityManager(), settingsForTestClient.getComponentID()); auditTrailClient = AccessComponentFactory.getInstance().createAuditTrailClient( - settingsForCUT, new DummySecurityManager(), settingsForCUT.getComponentID()); + settingsForTestClient, new DummySecurityManager(), settingsForTestClient.getComponentID()); } private void singleTreadedPut() throws Exception { @@ -73,9 +73,8 @@ private void singleTreadedPut() throws Exception { //ToDo assert that the files are present } - @Disabled("Temporarily disabled due to performance issues") @Test - @Tag("pillar-stress-test") + @Tag(PillarTestGroups.PILLAR_STRESS_TEST) void singleTreadedGetAuditTrails() throws Exception { final int NUMBER_OF_AUDITS = 100; final int PART_STATISTIC_INTERVAL = NUMBER_OF_AUDITS / 5; @@ -95,9 +94,8 @@ void singleTreadedGetAuditTrails() throws Exception { } } - @Disabled("Temporarily disabled due to performance issues") @Test - @Tag("pillar-stress-test") + @Tag(PillarTestGroups.PILLAR_STRESS_TEST) void parallelGetAuditTrails() throws Exception { final int NUMBER_OF_AUDITS = 10; final int PART_STATISTIC_INTERVAL = NUMBER_OF_AUDITS / 5; diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/GetFileStressIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/GetFileStressIT.java index 58747b4b7..1f9136351 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/GetFileStressIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/GetFileStressIT.java @@ -29,6 +29,7 @@ import org.bitrepository.bitrepositorymessages.IdentifyPillarsForGetFileResponse; import org.bitrepository.client.eventhandler.EventHandler; import org.bitrepository.common.utils.TestFileHelper; +import org.bitrepository.pillar.PillarTestGroups; import org.bitrepository.pillar.integration.perf.metrics.Metrics; import org.bitrepository.pillar.messagefactories.GetFileMessageFactory; import org.bitrepository.protocol.bus.MessageReceiver; @@ -36,6 +37,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import java.io.IOException; import java.nio.file.DirectoryStream; @@ -46,7 +49,8 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -public class GetFileStressIT extends PillarPerformanceTest { +@EnabledIfSystemProperty(named = "runStressTests", matches = "true") +public class GetFileStressIT extends PillarPerformanceIT { public static final String FOLDER_NAME = "src/test/resources"; protected GetFileClient getFileClient; @@ -74,7 +78,7 @@ private static void removeFiles(String fileStartsWith, String folderName) throws } @Test - @Tag("pillar-stress-test") + @Tag(PillarTestGroups.PILLAR_STRESS_TEST) void singleGetFilePerformanceTest() throws Exception { final int NUMBER_OF_FILES = 1000; final int PART_STATISTIC_INTERVAL = 100; @@ -94,7 +98,7 @@ void singleGetFilePerformanceTest() throws Exception { } @Test - @Tag("pillar-stress-test") + @Tag(PillarTestGroups.PILLAR_STRESS_TEST) void parallelGetFilePerformanceTest() throws Exception { final int numberOfFiles = testConfiguration.getInt("pillarintegrationtest.GetFileStressIT.parallelGet.numberOfFiles"); @@ -120,7 +124,7 @@ void parallelGetFilePerformanceTest() throws Exception { } @Test - @Tag("pillar-stress-test") + @Tag(PillarTestGroups.PILLAR_STRESS_TEST) void noIdentfyGetFilePerformanceTest() throws Exception { final int numberOfFiles = testConfiguration.getInt("pillarintegrationtest.GetFileStressIT.parallelGet.numberOfFiles"); @@ -154,15 +158,17 @@ defaultFileId, null, getPillarID(), getPillarID(), } public String lookupGetFileDestination() { - MessageReceiver clientReceiver = new MessageReceiver(settingsForTestClient.getReceiverDestinationID()); - messageBus.addListener(clientReceiver.getDestination(), clientReceiver.getMessageListener()); - GetFileMessageFactory pillarLookupmMsgFactory = - new GetFileMessageFactory(collectionID, settingsForTestClient, getPillarID(), null); - IdentifyPillarsForGetFileRequest identifyRequest = - pillarLookupmMsgFactory.createIdentifyPillarsForGetFileRequest(defaultFileId); - messageBus.sendMessage(identifyRequest); - String pillarDestination = clientReceiver.waitForMessage(IdentifyPillarsForGetFileResponse.class).getReplyTo(); - messageBus.removeListener(clientReceiver.getDestination(), clientReceiver.getMessageListener()); + String pillarDestination; + try (MessageReceiver clientReceiver = new MessageReceiver(settingsForTestClient.getReceiverDestinationID())) { + messageBus.addListener(clientReceiver.getDestination(), clientReceiver.getMessageListener()); + var getFileMessageFactory = + new GetFileMessageFactory(collectionID, settingsForTestClient, getPillarID(), null); + IdentifyPillarsForGetFileRequest identifyRequest = + getFileMessageFactory.createIdentifyPillarsForGetFileRequest(defaultFileId); + messageBus.sendMessage(identifyRequest); + pillarDestination = clientReceiver.waitForMessage(IdentifyPillarsForGetFileResponse.class).getReplyTo(); + messageBus.removeListener(clientReceiver.getDestination(), clientReceiver.getMessageListener()); + } return pillarDestination; } } \ No newline at end of file diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/PillarPerformanceTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/PillarPerformanceIT.java similarity index 86% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/PillarPerformanceTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/PillarPerformanceIT.java index 399345093..c8df36ede 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/PillarPerformanceTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/PillarPerformanceIT.java @@ -27,15 +27,15 @@ import org.bitrepository.client.eventhandler.EventHandler; import org.bitrepository.client.eventhandler.OperationEvent; import org.bitrepository.common.utils.TimeUtils; -import org.bitrepository.pillar.integration.PillarIntegrationTest; +import org.bitrepository.pillar.integration.PillarIntegrationIT; import org.bitrepository.pillar.integration.perf.metrics.ConsoleMetricAppender; import org.bitrepository.pillar.integration.perf.metrics.MetricAppender; import org.bitrepository.pillar.integration.perf.metrics.Metrics; import org.bitrepository.protocol.MessageContext; -import org.bitrepository.protocol.ProtocolComponentFactory; import org.bitrepository.protocol.bus.MessageReceiver; import org.bitrepository.protocol.messagebus.MessageListener; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,7 +44,8 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; -public class PillarPerformanceTest extends PillarIntegrationTest { +@EnabledIfSystemProperty(named = "runStressTests", matches = "true") +public class PillarPerformanceIT extends PillarIntegrationIT { protected final Logger log = LoggerFactory.getLogger(getClass()); protected List metricAppenders = new LinkedList<>(); protected String[] existingFiles; @@ -56,16 +57,9 @@ private void defineMetricAppenders() { } @Override - protected void addReceiver(MessageReceiver receiver) { + protected MessageReceiver addReceiver(MessageReceiver receiver) { // Do Nothing, test receivers should be used in performance tests. - } - /** - * Avoid using messagebuswrapper. - */ - @Override - protected void setupMessageBus() { - super.setupMessageBus(); - messageBus = ProtocolComponentFactory.getInstance().getMessageBus(settingsForCUT, securityManager); + return receiver; } /** @@ -73,18 +67,17 @@ protected void setupMessageBus() { */ protected void awaitAsynchronousCompletion(Metrics metrics, int numberOfOperations) { while(metrics.getCount() < numberOfOperations) { + log.info("...waiting for the last {} operations to finish ({})", (numberOfOperations - metrics.getCount()), TimeUtils.millisecondsToHuman(System.currentTimeMillis()-metrics.getStartTime())); try { Thread.sleep(6000); } catch (InterruptedException e) { Assertions.fail(e); } - System.out.println("...waiting for the last " + (numberOfOperations - metrics.getCount()) + - " operations to finish " + - "(" + TimeUtils.millisecondsToHuman(metrics.getStartTime()) + ")"); } + log.info("All operations finished in {}",TimeUtils.millisecondsToHuman(System.currentTimeMillis()-metrics.getStartTime())); } - protected class EventHandlerForMetrics implements EventHandler { + protected static class EventHandlerForMetrics implements EventHandler { private final Metrics metrics; public EventHandlerForMetrics(Metrics metrics) { this.metrics = metrics; @@ -102,7 +95,7 @@ public void handleEvent(OperationEvent event) { } } - protected class ParallelOperationLimiter { + protected static class ParallelOperationLimiter { private final BlockingQueue activeOperationss; ParallelOperationLimiter(int limit) { @@ -154,8 +147,7 @@ public MessageHandlerForMetrics(Metrics metrics, ParallelOperationLimiter putLim @Override public void onMessage(Message message, MessageContext messageContext) { - if (message instanceof MessageResponse) { - MessageResponse response = (MessageResponse)message; + if (message instanceof MessageResponse response) { if (response.getResponseInfo().getResponseCode().equals(ResponseCode.OPERATION_COMPLETED)) { log.debug("Received {} complete message({})", response.getClass().getSimpleName(), response.getCorrelationID()); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/PutFileStressIT.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/PutFileStressIT.java index d66e7a070..31c4408f0 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/PutFileStressIT.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/integration/perf/PutFileStressIT.java @@ -27,10 +27,12 @@ import org.bitrepository.modify.ModifyComponentFactory; import org.bitrepository.modify.putfile.BlockingPutFileClient; import org.bitrepository.modify.putfile.PutFileClient; +import org.bitrepository.pillar.PillarTestGroups; import org.bitrepository.pillar.integration.perf.metrics.Metrics; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -38,7 +40,8 @@ import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; -class PutFileStressIT extends PillarPerformanceTest { +@EnabledIfSystemProperty(named = "runStressTests", matches = "true") +class PutFileStressIT extends PillarPerformanceIT { protected PutFileClient putClient; @BeforeEach @@ -49,7 +52,7 @@ settingsForTestClient, createSecurityManager(), settingsForTestClient.getCompone } @Test - @Tag("pillar-stress-test") + @Tag(PillarTestGroups.PILLAR_STRESS_TEST) @Tag("stress-test-pillar-population") void singleTreadedPut() throws Exception { final int NUMBER_OF_FILES = 10; @@ -73,7 +76,7 @@ void singleTreadedPut() throws Exception { } @Test - @Tag("pillar-stress-test") + @Tag(PillarTestGroups.PILLAR_STRESS_TEST) void parallelPut() throws Exception { final int numberOfFiles = testConfiguration.getInt("pillarintegrationtest.PutFileStressIT.parallelPut.numberOfFiles"); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/DeleteFileTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/DeleteFileIT.java similarity index 90% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/DeleteFileTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/DeleteFileIT.java index 7bb25ea50..c4c8711e9 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/DeleteFileTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/DeleteFileIT.java @@ -35,7 +35,7 @@ import org.bitrepository.bitrepositorymessages.DeleteFileRequest; import org.bitrepository.bitrepositorymessages.IdentifyPillarsForDeleteFileRequest; import org.bitrepository.bitrepositorymessages.IdentifyPillarsForDeleteFileResponse; -import org.bitrepository.pillar.MockedPillarTest; +import org.bitrepository.pillar.MockedPillarIT; import org.bitrepository.pillar.messagefactories.DeleteFileMessageFactory; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -56,7 +56,7 @@ * Tests the PutFile functionality on the ReferencePillar. */ @ExtendWith(SuiteInfoParameterResolver.class) -class DeleteFileTest extends MockedPillarTest { +class DeleteFileIT extends MockedPillarIT { private DeleteFileMessageFactory msgFactory; @Override @@ -78,16 +78,8 @@ void goodCaseIdentification() throws Exception { addStep("Setup for having the file and delivering pillar id", "Should return true, when requesting file-id existence."); - Mockito.doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return true; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); - Mockito.doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return settingsForCUT.getComponentID(); - } - }).when(model).getPillarID(); + Mockito.doAnswer(invocation -> true).when(model).hasFileID(eq(FILE_ID), anyString()); + Mockito.doAnswer(invocation -> settingsForCUT.getComponentID()).when(model).getPillarID(); addStep("Create and send the identify request message.", "Should be received and handled by the pillar."); @@ -120,16 +112,8 @@ void badCaseIdentification() throws Exception { addStep("Setup for delivering pillar id and not having the file ", "Returns false, when requesting file-id existence."); - Mockito.doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return false; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); - Mockito.doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return settingsForCUT.getComponentID(); - } - }).when(model).getPillarID(); + Mockito.doAnswer(invocation -> false).when(model).hasFileID(eq(FILE_ID), anyString()); + Mockito.doAnswer(invocation -> settingsForCUT.getComponentID()).when(model).getPillarID(); addStep("Create and send the identify request message.", "Should be received and handled by the pillar."); @@ -162,16 +146,8 @@ void badCaseOperationNoFile() throws Exception { addStep("Setup for delivering pillar id and not having the file ", "Returns false, when requesting file-id existence."); - Mockito.doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return false; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); - Mockito.doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return settingsForCUT.getComponentID(); - } - }).when(model).getPillarID(); + Mockito.doAnswer(invocation -> false).when(model).hasFileID(eq(FILE_ID), anyString()); + Mockito.doAnswer(invocation -> settingsForCUT.getComponentID()).when(model).getPillarID(); addStep("Create and send the actual DeleteFile message to the pillar.", "Should be received and handled by the pillar."); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GeneralMessageHandlingTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GeneralMessageHandlingIT.java similarity index 97% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GeneralMessageHandlingTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GeneralMessageHandlingIT.java index 44150a0a9..edac1358f 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GeneralMessageHandlingTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GeneralMessageHandlingIT.java @@ -28,14 +28,13 @@ import org.bitrepository.SuiteInfoParameterResolver; import org.bitrepository.bitrepositorymessages.MessageRequest; import org.bitrepository.bitrepositorymessages.MessageResponse; -import org.bitrepository.pillar.MockedPillarTest; +import org.bitrepository.pillar.MockedPillarIT; import org.bitrepository.pillar.common.MessageHandlerContext; import org.bitrepository.pillar.messagehandler.PillarMessageHandler; import org.bitrepository.pillar.store.StorageModel; import org.bitrepository.protocol.MessageContext; import org.bitrepository.service.exception.RequestHandlerException; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -45,12 +44,13 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @ExtendWith(SuiteInfoParameterResolver.class) -class GeneralMessageHandlingTest extends MockedPillarTest { +class GeneralMessageHandlingIT extends MockedPillarIT { MockRequestHandler requestHandler; - @BeforeEach - void setup() { + @Override + protected void initializeCUT() { + super.initializeCUT(); this.requestHandler = new MockRequestHandler(context, model); } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetAuditTrailsTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetAuditTrailsIT.java similarity index 99% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetAuditTrailsTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetAuditTrailsIT.java index 69e861dd5..220f451bb 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetAuditTrailsTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetAuditTrailsIT.java @@ -31,7 +31,7 @@ import org.bitrepository.bitrepositorymessages.IdentifyContributorsForGetAuditTrailsRequest; import org.bitrepository.bitrepositorymessages.IdentifyContributorsForGetAuditTrailsResponse; import org.bitrepository.common.utils.CalendarUtils; -import org.bitrepository.pillar.MockedPillarTest; +import org.bitrepository.pillar.MockedPillarIT; import org.bitrepository.pillar.messagefactories.GetAuditTrailsMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; @@ -46,11 +46,11 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -class GetAuditTrailsTest extends MockedPillarTest { +class GetAuditTrailsIT extends MockedPillarIT { private GetAuditTrailsMessageFactory msgFactory; @Override - public void initializeCUT() { + protected void initializeCUT() { super.initializeCUT(); msgFactory = new GetAuditTrailsMessageFactory(collectionID, settingsForTestClient); } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetChecksumsTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetChecksumsIT.java similarity index 99% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetChecksumsTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetChecksumsIT.java index cfacccfd3..63ed714e6 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetChecksumsTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetChecksumsIT.java @@ -37,7 +37,7 @@ import org.bitrepository.bitrepositorymessages.IdentifyPillarsForGetChecksumsResponse; import org.bitrepository.common.utils.CalendarUtils; import org.bitrepository.common.utils.FileIDsUtils; -import org.bitrepository.pillar.MockedPillarTest; +import org.bitrepository.pillar.MockedPillarIT; import org.bitrepository.pillar.messagefactories.GetChecksumsMessageFactory; import org.bitrepository.pillar.store.checksumdatabase.ChecksumEntry; import org.bitrepository.pillar.store.checksumdatabase.ExtractedChecksumResultSet; @@ -63,11 +63,11 @@ * Tests the PutFile functionality on the ReferencePillar. */ @ExtendWith(SuiteInfoParameterResolver.class) -class GetChecksumsTest extends MockedPillarTest { +class GetChecksumsIT extends MockedPillarIT { private GetChecksumsMessageFactory msgFactory; @Override - public void initializeCUT() { + protected void initializeCUT() { super.initializeCUT(); msgFactory = new GetChecksumsMessageFactory(collectionID, settingsForTestClient, getPillarID(), pillarDestinationId); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileIDsTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileIDsIT.java similarity index 99% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileIDsTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileIDsIT.java index c0084b099..667ab9840 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileIDsTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileIDsIT.java @@ -37,7 +37,7 @@ import org.bitrepository.common.utils.AllureTestUtils; import org.bitrepository.common.utils.CalendarUtils; import org.bitrepository.common.utils.FileIDsUtils; -import org.bitrepository.pillar.MockedPillarTest; +import org.bitrepository.pillar.MockedPillarIT; import org.bitrepository.pillar.messagefactories.GetFileIDsMessageFactory; import org.bitrepository.pillar.store.checksumdatabase.ExtractedFileIDsResultSet; import org.junit.jupiter.api.Assertions; @@ -58,11 +58,11 @@ * Tests the GetFileIDs functionality on the ReferencePillar. */ @ExtendWith(SuiteInfoParameterResolver.class) -class GetFileIDsTest extends MockedPillarTest { +class GetFileIDsIT extends MockedPillarIT { private GetFileIDsMessageFactory msgFactory; @Override - public void initializeCUT() { + protected void initializeCUT() { super.initializeCUT(); msgFactory = new GetFileIDsMessageFactory(collectionID, settingsForTestClient, getPillarID(), pillarDestinationId); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileIT.java similarity index 98% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileIT.java index abd8cb773..0ec840574 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/GetFileIT.java @@ -34,7 +34,7 @@ import org.bitrepository.bitrepositorymessages.IdentifyPillarsForGetFileRequest; import org.bitrepository.bitrepositorymessages.IdentifyPillarsForGetFileResponse; import org.bitrepository.common.filestore.FileInfo; -import org.bitrepository.pillar.MockedPillarTest; +import org.bitrepository.pillar.MockedPillarIT; import org.bitrepository.pillar.common.FileInfoStub; import org.bitrepository.pillar.messagefactories.GetFileMessageFactory; import org.bitrepository.service.exception.IdentifyContributorException; @@ -59,11 +59,11 @@ * Tests the PutFile functionality on the ReferencePillar. */ @ExtendWith(SuiteInfoParameterResolver.class) -class GetFileTest extends MockedPillarTest { +class GetFileIT extends MockedPillarIT { private GetFileMessageFactory msgFactory; @Override - public void initializeCUT() { + protected void initializeCUT() { super.initializeCUT(); msgFactory = new GetFileMessageFactory(collectionID, settingsForTestClient, getPillarID(), pillarDestinationId); } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/PutFileTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/PutFileIT.java similarity index 99% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/PutFileTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/PutFileIT.java index a47bfc39b..8f51ceceb 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/PutFileTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/PutFileIT.java @@ -38,7 +38,7 @@ import org.bitrepository.bitrepositorymessages.PutFileRequest; import org.bitrepository.common.utils.Base16Utils; import org.bitrepository.common.utils.CalendarUtils; -import org.bitrepository.pillar.MockedPillarTest; +import org.bitrepository.pillar.MockedPillarIT; import org.bitrepository.pillar.messagefactories.PutFileMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; @@ -56,12 +56,12 @@ * Tests the PutFile functionality on the ReferencePillar. */ @ExtendWith(SuiteInfoParameterResolver.class) -class PutFileTest extends MockedPillarTest { +class PutFileIT extends MockedPillarIT { PutFileMessageFactory msgFactory; Long FILE_SIZE = 1L; @Override - public void initializeCUT() { + protected void initializeCUT() { super.initializeCUT(); msgFactory = new PutFileMessageFactory(collectionID, settingsForTestClient, getPillarID(), pillarDestinationId); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/ReplaceFileTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/ReplaceFileIT.java similarity index 99% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/ReplaceFileTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/ReplaceFileIT.java index 930c65d6e..f0d572ffc 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/ReplaceFileTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/messagehandling/ReplaceFileIT.java @@ -39,7 +39,7 @@ import org.bitrepository.bitrepositorymessages.ReplaceFileRequest; import org.bitrepository.common.utils.Base16Utils; import org.bitrepository.common.utils.CalendarUtils; -import org.bitrepository.pillar.MockedPillarTest; +import org.bitrepository.pillar.MockedPillarIT; import org.bitrepository.pillar.messagefactories.ReplaceFileMessageFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; @@ -60,12 +60,12 @@ * Tests the ReplaceFile functionality on the ReferencePillar. */ @ExtendWith(SuiteInfoParameterResolver.class) -class ReplaceFileTest extends MockedPillarTest { +class ReplaceFileIT extends MockedPillarIT { ReplaceFileMessageFactory msgFactory; Long FILE_SIZE = 1L; @Override - public void initializeCUT() { + protected void initializeCUT() { super.initializeCUT(); msgFactory = new ReplaceFileMessageFactory(collectionID, settingsForTestClient, getPillarID(), pillarDestinationId); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/schedulablejobs/RecalculateChecksumWorkflowTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/schedulablejobs/RecalculateChecksumWorkflowIT.java similarity index 79% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/schedulablejobs/RecalculateChecksumWorkflowTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/schedulablejobs/RecalculateChecksumWorkflowIT.java index 8e1ec428d..af43acf8b 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/schedulablejobs/RecalculateChecksumWorkflowTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/schedulablejobs/RecalculateChecksumWorkflowIT.java @@ -22,7 +22,7 @@ */ import org.bitrepository.SuiteInfoParameterResolver; -import org.bitrepository.pillar.DefaultPillarTest; +import org.bitrepository.pillar.DefaultPillarIT; import org.bitrepository.service.workflow.SchedulableJob; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -32,13 +32,14 @@ import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; -import java.util.Date; + +import java.time.Instant; import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -class RecalculateChecksumWorkflowTest extends DefaultPillarTest { +class RecalculateChecksumWorkflowIT extends DefaultPillarIT { DatatypeFactory factory; @@ -52,7 +53,7 @@ void setUpFactory() throws DatatypeConfigurationException { @Tag("pillartest") void testWorkflowRecalculatesChecksum() throws Exception { addDescription("Test that the workflow recalculates the workflows, when the maximum age has been met."); - Date beforeWorkflowDate = csCache.getCalculationDate(defaultFileId, collectionID); + Instant beforeWorkflowDate = csCache.getCalculationInstant(defaultFileId, collectionID); Assertions.assertEquals(1, csCache.getAllFileIDs(collectionID).size()); Assertions.assertEquals(1, archives.getAllFileIds(collectionID).size()); settingsForCUT.getReferenceSettings().getPillarSettings().setMaxAgeForChecksums(factory.newDuration(0)); @@ -64,10 +65,10 @@ void testWorkflowRecalculatesChecksum() throws Exception { addStep("Create and run workflow", "The checksum"); SchedulableJob workflow = new RecalculateChecksumJob(collectionID, model); workflow.start(); - Date afterWorkflowDate = csCache.getCalculationDate(defaultFileId, collectionID); + Instant afterWorkflowDate = csCache.getCalculationInstant(defaultFileId, collectionID); - Assertions.assertTrue(beforeWorkflowDate.getTime() < afterWorkflowDate.getTime(), - beforeWorkflowDate.getTime() + " < " + afterWorkflowDate.getTime()); + Assertions.assertTrue(beforeWorkflowDate.isBefore(afterWorkflowDate), + beforeWorkflowDate.toEpochMilli() + " < " + afterWorkflowDate.toEpochMilli()); } @Test @@ -76,7 +77,7 @@ void testWorkflowRecalculatesChecksum() throws Exception { void testWorkflowDoesNotRecalculateWhenNotNeeded() throws Exception { addDescription("Test that the workflow does not recalculates the workflows, when the maximum age has " + "not yet been met."); - Date beforeWorkflowDate = csCache.getCalculationDate(defaultFileId, collectionID); + Instant beforeWorkflowDate = csCache.getCalculationInstant(defaultFileId, collectionID); Assertions.assertEquals(1, csCache.getAllFileIDs(collectionID).size()); Assertions.assertEquals(1, archives.getAllFileIds(collectionID).size()); settingsForCUT.getReferenceSettings().getPillarSettings() @@ -89,9 +90,9 @@ void testWorkflowDoesNotRecalculateWhenNotNeeded() throws Exception { addStep("Create and run workflow", "The checksum"); SchedulableJob workflow = new RecalculateChecksumJob(collectionID, model); workflow.start(); - Date afterWorkflowDate = csCache.getCalculationDate(defaultFileId, collectionID); + Instant afterWorkflowDate = csCache.getCalculationInstant(defaultFileId, collectionID); - Assertions.assertEquals(afterWorkflowDate.getTime(), beforeWorkflowDate.getTime(), - beforeWorkflowDate.getTime() + " == " + afterWorkflowDate.getTime()); + Assertions.assertEquals(afterWorkflowDate, beforeWorkflowDate, + beforeWorkflowDate + " == " + afterWorkflowDate); } } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/ChecksumPillarModelTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/ChecksumPillarModelIT.java similarity index 98% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/ChecksumPillarModelTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/ChecksumPillarModelIT.java index b93238503..43d605ad7 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/ChecksumPillarModelTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/ChecksumPillarModelIT.java @@ -25,12 +25,13 @@ import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumType; import org.bitrepository.common.utils.ChecksumUtils; -import org.bitrepository.pillar.DefaultFixturePillarTest; +import org.bitrepository.pillar.DefaultFixturePillarIT; import org.bitrepository.pillar.store.checksumcache.MemoryCacheMock; import org.bitrepository.pillar.store.checksumdatabase.ChecksumStore; import org.bitrepository.service.AlarmDispatcher; import org.bitrepository.settings.referencesettings.ChecksumPillarFileDownload; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -42,7 +43,7 @@ @ExtendWith(SuiteInfoParameterResolver.class) -public class ChecksumPillarModelTest extends DefaultFixturePillarTest { +public class ChecksumPillarModelIT extends DefaultFixturePillarIT { ChecksumStorageModel pillarModel; ChecksumStore cache; protected AlarmDispatcher alarmDispatcher; @@ -53,6 +54,7 @@ public class ChecksumPillarModelTest extends DefaultFixturePillarTest { @Override protected void initializeCUT() { + super.initializeCUT(); cache = new MemoryCacheMock(); alarmDispatcher = new AlarmDispatcher(settingsForCUT, messageBus); pillarModel = new ChecksumStorageModel(cache, alarmDispatcher, settingsForCUT); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/FullPillarModelTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/FullPillarModelIT.java similarity index 97% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/FullPillarModelTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/FullPillarModelIT.java index d5d888ca2..67355e6ee 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/FullPillarModelTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/FullPillarModelIT.java @@ -27,13 +27,14 @@ import org.bitrepository.common.filestore.FileInfo; import org.bitrepository.common.filestore.FileStore; import org.bitrepository.common.utils.ChecksumUtils; -import org.bitrepository.pillar.DefaultFixturePillarTest; +import org.bitrepository.pillar.DefaultFixturePillarIT; import org.bitrepository.pillar.store.checksumcache.MemoryCacheMock; import org.bitrepository.pillar.store.checksumdatabase.ChecksumStore; import org.bitrepository.pillar.store.filearchive.CollectionArchiveManager; import org.bitrepository.service.AlarmDispatcher; import org.bitrepository.service.exception.RequestHandlerException; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -45,7 +46,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -public class FullPillarModelTest extends DefaultFixturePillarTest { +public class FullPillarModelIT extends DefaultFixturePillarIT { FileStorageModel pillarModel; ChecksumStore cache; FileStore archives; @@ -59,6 +60,7 @@ public class FullPillarModelTest extends DefaultFixturePillarTest { @Override protected void initializeCUT() { + super.initializeCUT(); cache = new MemoryCacheMock(); archives = new CollectionArchiveManager(settingsForCUT); alarmDispatcher = new AlarmDispatcher(settingsForCUT, messageBus); diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/archive/ArchiveDirectoryTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/archive/ArchiveDirectoryTest.java index eb54203a8..a2915f099 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/archive/ArchiveDirectoryTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/archive/ArchiveDirectoryTest.java @@ -41,7 +41,7 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; class ArchiveDirectoryTest { - private static final String DIR_NAME = "archive-directory"; + private static final String DIR_NAME = "target/test/archive-directory"; private static final String FILE_DIR_NAME = DIR_NAME + "/fileDir"; private static final String FOLDER_DIR_NAME = DIR_NAME + "/" + ArchiveDirectory.FOLDER_DIR; diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/archive/ReferenceArchiveTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/archive/ReferenceArchiveIT.java similarity index 95% rename from bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/archive/ReferenceArchiveTest.java rename to bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/archive/ReferenceArchiveIT.java index 697b4e9eb..02977c0ed 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/archive/ReferenceArchiveTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/archive/ReferenceArchiveIT.java @@ -28,11 +28,12 @@ import org.bitrepository.SuiteInfoParameterResolver; import org.bitrepository.common.utils.FileUtils; -import org.bitrepository.pillar.DefaultPillarTest; +import org.bitrepository.pillar.DefaultPillarIT; import org.bitrepository.pillar.common.MessageHandlerContext; import org.bitrepository.pillar.messagehandler.PillarMediator; import org.bitrepository.pillar.store.filearchive.ReferenceArchive; import org.bitrepository.service.audit.MockAuditManager; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -49,25 +50,24 @@ import static org.bitrepository.common.utils.AllureTestUtils.addStep; @ExtendWith(SuiteInfoParameterResolver.class) -class ReferenceArchiveTest extends DefaultPillarTest { +class ReferenceArchiveIT extends DefaultPillarIT { protected ReferenceArchive archive; protected PillarMediator mediator; protected MockAuditManager audits; protected MessageHandlerContext context; - private static final String DIR_NAME = "archive-directory"; + private static final String DIR_NAME = "target/test/reference-archive-directory"; private static final String FILE_DIR_NAME = DIR_NAME + "/fileDir"; private static final String EXISTING_FILE = "file1"; private static final String MISSING_FILE = "Missing-filE"; - @Override - protected void shutdownCUT() { + @AfterEach + protected void cleanTestDir() { File archiveDirectory = new File(DIR_NAME); if (archiveDirectory.exists()) { FileUtils.delete(new File(DIR_NAME)); } - super.shutdownCUT(); } @Test diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/checksumcache/ChecksumDatabaseTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/checksumcache/ChecksumDatabaseTest.java index 1bdf5aab4..bd988e96e 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/checksumcache/ChecksumDatabaseTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/store/checksumcache/ChecksumDatabaseTest.java @@ -26,26 +26,29 @@ import org.bitrepository.common.settings.TestSettingsProvider; import org.bitrepository.common.utils.Base16Utils; import org.bitrepository.common.utils.CalendarUtils; -import org.bitrepository.pillar.common.ChecksumDatabaseCreator; import org.bitrepository.pillar.store.checksumdatabase.ChecksumDAO; import org.bitrepository.pillar.store.checksumdatabase.ChecksumDatabaseManager; import org.bitrepository.pillar.store.checksumdatabase.ChecksumEntry; import org.bitrepository.pillar.store.checksumdatabase.ExtractedChecksumResultSet; import org.bitrepository.pillar.store.checksumdatabase.ExtractedFileIDsResultSet; -import org.bitrepository.service.database.DerbyDatabaseDestroyer; -import org.bitrepository.settings.referencesettings.DatabaseSpecifics; import org.bitrepository.settings.repositorysettings.PillarIDs; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.testcontainers.containers.BindMode; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; +import java.sql.DriverManager; import java.time.Instant; import java.util.List; import static org.bitrepository.common.utils.AllureTestUtils.addDescription; import static org.bitrepository.common.utils.AllureTestUtils.addStep; +@Testcontainers class ChecksumDatabaseTest { private String collectionID; protected Settings settings; @@ -54,17 +57,31 @@ class ChecksumDatabaseTest { private static final String DEFAULT_CHECKSUM = "abcdef0110fedcba"; private static final Instant DEFAULT_DATE = Instant.ofEpochMilli(System.currentTimeMillis()); + @Container + static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:18-alpine") + .withClasspathResourceMapping( + "sql/postgres/checksumDBCreation.sql", + "/docker-entrypoint-initdb.d/init.sql", + BindMode.READ_ONLY); + @BeforeEach void setup() throws Exception { loadSettings(); - collectionID = settings.getCollections().get(0).getID(); - - DatabaseSpecifics checksumDB = - settings.getReferenceSettings().getPillarSettings().getChecksumDatabase(); - DerbyDatabaseDestroyer.deleteDatabase(checksumDB); - - ChecksumDatabaseCreator checksumDatabaseCreator = new ChecksumDatabaseCreator(); - checksumDatabaseCreator.createChecksumDatabase(settings, null); + collectionID = settings.getCollections().getFirst().getID(); + + var dbSettings = settings.getReferenceSettings().getPillarSettings().getChecksumDatabase(); + dbSettings.setDatabaseURL(postgreSQLContainer.getJdbcUrl()); + dbSettings.setUsername(postgreSQLContainer.getUsername()); + dbSettings.setPassword(postgreSQLContainer.getPassword()); + dbSettings.setDriverClass(postgreSQLContainer.getDriverClassName()); + + try (var connection = DriverManager.getConnection(dbSettings.getDatabaseURL(), + dbSettings.getUsername(), + dbSettings.getPassword()); + var statement = connection.createStatement()) { + //quickly empty the database between tests + statement.execute("TRUNCATE TABLE checksums;"); + } } @Test @@ -93,10 +110,10 @@ void testChecksumDatabaseExtraction() { List entries = cache.getChecksumResults((Instant) null, (Instant) null, null, collectionID).getEntries(); Assertions.assertEquals(1, entries.size()); - Assertions.assertEquals(DEFAULT_FILE_ID, entries.get(0).getFileID()); - Assertions.assertEquals(DEFAULT_CHECKSUM, Base16Utils.decodeBase16(entries.get(0).getChecksumValue())); + Assertions.assertEquals(DEFAULT_FILE_ID, entries.getFirst().getFileID()); + Assertions.assertEquals(DEFAULT_CHECKSUM, Base16Utils.decodeBase16(entries.getFirst().getChecksumValue())); Assertions.assertEquals(DEFAULT_DATE, - CalendarUtils.convertFromXMLGregorianCalendarToInstant(entries.get(0).getCalculationTimestamp())); + CalendarUtils.convertFromXMLGregorianCalendarToInstant(entries.getFirst().getCalculationTimestamp())); } @Test @@ -203,7 +220,7 @@ void testSpecifiedEntryExtraction() { addStep("Extract with a maximum of 1 entry", "The oldest entry"); extractedResults = cache.getChecksumResults((Instant) null, (Instant) null, 1L, collectionID); Assertions.assertEquals(1, extractedResults.getEntries().size()); - ChecksumDataForChecksumSpecTYPE dataEntry = extractedResults.getEntries().get(0); + ChecksumDataForChecksumSpecTYPE dataEntry = extractedResults.getEntries().getFirst(); Assertions.assertEquals(0, CalendarUtils.convertFromXMLGregorianCalendar(dataEntry.getCalculationTimestamp()).getTime()); Assertions.assertEquals(oldFile, dataEntry.getFileID()); @@ -211,7 +228,7 @@ void testSpecifiedEntryExtraction() { addStep("Extract all dates older than this tests instantiation", "The oldest entry"); extractedResults = cache.getChecksumResults((Instant) null, beforeTest, null, collectionID); Assertions.assertEquals(1, extractedResults.getEntries().size()); - dataEntry = extractedResults.getEntries().get(0); + dataEntry = extractedResults.getEntries().getFirst(); Assertions.assertEquals(0, CalendarUtils.convertFromXMLGregorianCalendar(dataEntry.getCalculationTimestamp()).getTime()); Assertions.assertEquals(oldFile, dataEntry.getFileID()); @@ -219,7 +236,7 @@ void testSpecifiedEntryExtraction() { addStep("Extract all dates newer than this tests instantiation", "The default entry"); extractedResults = cache.getChecksumResults(beforeTest, (Instant) null, null, collectionID); Assertions.assertEquals(1, extractedResults.getEntries().size()); - dataEntry = extractedResults.getEntries().get(0); + dataEntry = extractedResults.getEntries().getFirst(); Assertions.assertEquals(DEFAULT_DATE, CalendarUtils.convertFromXMLGregorianCalendarToInstant(dataEntry.getCalculationTimestamp())); Assertions.assertEquals(DEFAULT_FILE_ID, dataEntry.getFileID()); @@ -251,7 +268,7 @@ void testGetFileIDsRestrictions() { addStep("Test with no time restrictions and 10000 max_results", "Delivers both files."); ExtractedFileIDsResultSet efirs = - cache.getFileIDs((Instant) null, (Instant) null, 100000L, null, collectionID); + cache.getFileIDs((Instant) null, (Instant) null, 100000L, null, collectionID); Assertions.assertEquals(2, efirs.getEntries().getFileIDsDataItems().getFileIDsDataItem().size()); addStep("Test with minimum-date earlier than first file", "Delivers both files."); @@ -359,7 +376,9 @@ void testGetChecksumResult() { addStep("Test with too old an upper limit", "Does not retrieve the file"); extractedChecksums = cache.getChecksumResult(Instant.EPOCH, - DEFAULT_DATE.minusMillis(1), DEFAULT_FILE_ID, collectionID); + DEFAULT_DATE.minusMillis(1), + DEFAULT_FILE_ID, + collectionID); Assertions.assertEquals(0, extractedChecksums.getEntries().size()); } diff --git a/bitrepository-reference-pillar/src/test/resources/conf/ReferenceSettings.xml b/bitrepository-reference-pillar/src/test/resources/conf/ReferenceSettings.xml index a74e730df..a76c85112 100644 --- a/bitrepository-reference-pillar/src/test/resources/conf/ReferenceSettings.xml +++ b/bitrepository-reference-pillar/src/test/resources/conf/ReferenceSettings.xml @@ -46,18 +46,22 @@ P1D PT1H - org.apache.derby.jdbc.EmbeddedDriver - jdbc:derby:target/reference1pillar/auditcontributerdb + org.postgresql.Driver + jdbc:postgresql://localhost:65432/auditcontributerdb + testcontainerUser + testcontainerPassword - org.apache.derby.jdbc.EmbeddedDriver - jdbc:derby:target/reference1pillar/checksumdb + org.postgresql.Driver + jdbc:postgresql://localhost:54321/checksumdb + testcontainerUser + testcontainerPassword ERROR true FILE - src/test/resources + target/fileexchange diff --git a/bitrepository-reference-pillar/src/test/resources/logback-test.xml b/bitrepository-reference-pillar/src/test/resources/logback-test.xml index 4bc0d7be7..d5b03bddd 100644 --- a/bitrepository-reference-pillar/src/test/resources/logback-test.xml +++ b/bitrepository-reference-pillar/src/test/resources/logback-test.xml @@ -1,14 +1,18 @@ - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + %d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n + + + + diff --git a/bitrepository-reference-settings/pom.xml b/bitrepository-reference-settings/pom.xml index 8fbb4e5e9..3f2cb3dbc 100644 --- a/bitrepository-reference-settings/pom.xml +++ b/bitrepository-reference-settings/pom.xml @@ -1,102 +1,96 @@ - - 4.0.0 - - org.bitrepository.reference - bitrepository-parent - 1.12-SNAPSHOT - - bitrepository-reference-settings - Bitrepository Reference Settings - Settings functionality for the reference code. + + 4.0.0 + + org.bitrepository.reference + bitrepository-parent + 1.12-SNAPSHOT + + bitrepository-reference-settings + Bitrepository Reference Settings + Settings functionality for the reference code. - - target/generated-sources/jaxb - - - src/main/resources - true - - - ${project.build.directory}/xsd - - *.xsd - *.xml - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.15.0 - - 21 - - - - maven-resources-plugin - - - copy-resources - generate-sources - - copy-resources - - - ${project.build.directory}/xsd - - - src/main/resources/xsd - true - - - - - - - - - org.codehaus.mojo - jaxb2-maven-plugin - 2.5.0 - - - generate-classes-from-xsds - - xjc - - - - - - ${project.build.directory}/xsd/ReferenceSettings.xsd - - - ${project.build.directory}/xsd/bindings-reference-settings.xjb - - true - - -XtoString - -Xequals - -XhashCode - -Xannotate - - - - - org.jvnet.jaxb2_commons - jaxb2-basics - 0.11.1 - - - org.jvnet.jaxb2_commons - jaxb2-basics-annotate - 1.1.0 - - - - - + + + org.jvnet.jaxb + jaxb-plugins-runtime + + + + + target/generated-sources/jaxb + + + src/main/resources + true + + + ${project.build.directory}/xsd + + *.xsd + *.xml + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 21 + + + + maven-resources-plugin + + + copy-resources + generate-sources + + copy-resources + + + ${project.build.directory}/xsd + + + src/main/resources/xsd + true + + + + + + + + org.jvnet.jaxb + jaxb-maven-plugin + ${jaxb.version} + + + generate-classes-from-xsds + + generate + + + + + ${project.basedir}/src/main/resources/xsd/ + true + + -XtoString + -XsimpleEquals + -XsimpleHashCode + + + + org.jvnet.jaxb + jaxb-plugins + ${jaxb.version} + + + + + + diff --git a/bitrepository-reference-settings/src/main/resources/xsd/bindings-reference-settings.xjb b/bitrepository-reference-settings/src/main/resources/xsd/bindings-reference-settings.xjb index 558fd1450..46bf3fb64 100644 --- a/bitrepository-reference-settings/src/main/resources/xsd/bindings-reference-settings.xjb +++ b/bitrepository-reference-settings/src/main/resources/xsd/bindings-reference-settings.xjb @@ -1,7 +1,6 @@ - + - diff --git a/bitrepository-service/pom.xml b/bitrepository-service/pom.xml index 082e2abbf..d9a227ea9 100644 --- a/bitrepository-service/pom.xml +++ b/bitrepository-service/pom.xml @@ -19,37 +19,30 @@ org.apache.derby derby - ${derby.version} org.apache.derby derbyclient - ${derby.version} org.apache.derby derbynet - ${derby.version} org.apache.derby derbytools - ${derby.version} org.postgresql postgresql - 42.7.8 com.mchange c3p0 - 0.12.0 - javax.servlet - javax.servlet-api - ${javax.servlet.version} + jakarta.servlet + jakarta.servlet-api provided @@ -60,5 +53,15 @@ test-jar test + + org.testcontainers + testcontainers-postgresql + test + + + org.testcontainers + testcontainers-junit-jupiter + test + diff --git a/bitrepository-service/src/main/java/org/bitrepository/service/AbstractBitrepositoryContextListener.java b/bitrepository-service/src/main/java/org/bitrepository/service/AbstractBitrepositoryContextListener.java index fb21623b8..648bf6dde 100644 --- a/bitrepository-service/src/main/java/org/bitrepository/service/AbstractBitrepositoryContextListener.java +++ b/bitrepository-service/src/main/java/org/bitrepository/service/AbstractBitrepositoryContextListener.java @@ -21,13 +21,12 @@ */ package org.bitrepository.service; +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; import org.bitrepository.protocol.utils.LogbackConfigLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; - /** * The Listener has two intentions * 1) Acquire necessary information at startup to locate configuration files and create the first instance diff --git a/bitrepository-service/src/main/java/org/bitrepository/service/contributor/handler/GetAuditTrailsRequestHandler.java b/bitrepository-service/src/main/java/org/bitrepository/service/contributor/handler/GetAuditTrailsRequestHandler.java index 7ca6f7c45..8a7d21aa9 100644 --- a/bitrepository-service/src/main/java/org/bitrepository/service/contributor/handler/GetAuditTrailsRequestHandler.java +++ b/bitrepository-service/src/main/java/org/bitrepository/service/contributor/handler/GetAuditTrailsRequestHandler.java @@ -22,6 +22,8 @@ package org.bitrepository.service.contributor.handler; import java.io.ByteArrayInputStream; + +import jakarta.xml.bind.JAXBException; import org.bitrepository.bitrepositorydata.GetAuditTrailsResults; import org.bitrepository.bitrepositoryelements.ResponseCode; import org.bitrepository.bitrepositoryelements.ResponseInfo; @@ -45,7 +47,6 @@ import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBException; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; diff --git a/bitrepository-service/src/main/java/org/bitrepository/service/database/DatabaseCreator.java b/bitrepository-service/src/main/java/org/bitrepository/service/database/DatabaseCreator.java index 2b8c0566a..1bfeb1439 100644 --- a/bitrepository-service/src/main/java/org/bitrepository/service/database/DatabaseCreator.java +++ b/bitrepository-service/src/main/java/org/bitrepository/service/database/DatabaseCreator.java @@ -63,7 +63,7 @@ protected void createDatabase(DatabaseSpecifics databaseSpecifics, String script private static DatabaseSpecifics updateDatabaseSpecificsForDBCreation(DatabaseSpecifics databaseSpecifics) { DatabaseSpecifics newDatabaseSpecifics = new DatabaseSpecifics(); newDatabaseSpecifics.setDriverClass(databaseSpecifics.getDriverClass()); - newDatabaseSpecifics.setDatabaseURL(databaseSpecifics.getDatabaseURL() + ";create=true"); + newDatabaseSpecifics.setDatabaseURL(databaseSpecifics.getDatabaseURL() ); newDatabaseSpecifics.setUsername(databaseSpecifics.getUsername()); newDatabaseSpecifics.setPassword(databaseSpecifics.getPassword()); return newDatabaseSpecifics; diff --git a/bitrepository-service/src/main/java/org/bitrepository/service/database/DatabaseMaintainer.java b/bitrepository-service/src/main/java/org/bitrepository/service/database/DatabaseMaintainer.java index 019381bd1..b0edd2cf1 100644 --- a/bitrepository-service/src/main/java/org/bitrepository/service/database/DatabaseMaintainer.java +++ b/bitrepository-service/src/main/java/org/bitrepository/service/database/DatabaseMaintainer.java @@ -118,7 +118,7 @@ private static Reader getReaderForFile(String filePath) throws FileNotFoundExcep */ protected static Connection getDBConnection(DatabaseSpecifics databaseSpecifics) throws SQLException, ClassNotFoundException { Class.forName(databaseSpecifics.getDriverClass()); - Connection connection = DriverManager.getConnection(databaseSpecifics.getDatabaseURL()); + Connection connection = DriverManager.getConnection(databaseSpecifics.getDatabaseURL(), databaseSpecifics.getUsername(), databaseSpecifics.getPassword()); return connection; } } diff --git a/bitrepository-service/src/main/java/org/bitrepository/service/database/SqlScriptRunner.java b/bitrepository-service/src/main/java/org/bitrepository/service/database/SqlScriptRunner.java index 629f114cc..b98a94888 100644 --- a/bitrepository-service/src/main/java/org/bitrepository/service/database/SqlScriptRunner.java +++ b/bitrepository-service/src/main/java/org/bitrepository/service/database/SqlScriptRunner.java @@ -63,7 +63,7 @@ public SqlScriptRunner(Connection connection, } /** - * @param delimiter The statement delimiter, eg. ';' for mysql. + * @param delimiter The statement delimiter, i.e. ';' for mysql. * @param fullLineDelimiter true if the delimiter used to distinguish between lines. */ public void setDelimiter(String delimiter, boolean fullLineDelimiter) { diff --git a/bitrepository-service/src/main/java/org/bitrepository/service/workflow/WorkflowState.java b/bitrepository-service/src/main/java/org/bitrepository/service/workflow/WorkflowState.java index aa9631954..0f26be5ac 100644 --- a/bitrepository-service/src/main/java/org/bitrepository/service/workflow/WorkflowState.java +++ b/bitrepository-service/src/main/java/org/bitrepository/service/workflow/WorkflowState.java @@ -24,7 +24,7 @@ */ package org.bitrepository.service.workflow; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; /** * States for a workflow. diff --git a/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBCreation.sql b/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBCreation.sql index 55bf9a713..912c582bc 100644 --- a/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBCreation.sql +++ b/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBCreation.sql @@ -29,15 +29,15 @@ -- of the tables, especially when upgrading. -- Expected entry count: only those in this script. --**************************************************************************-- -CREATE TABLE tableversions ( +CREATE TABLE IF NOT EXISTS tableversions ( tablename VARCHAR(100) NOT NULL, -- Name of table version INT NOT NULL -- version of table ); -insert into tableversions ( tablename, version ) values ( 'audit', 5); -insert into tableversions ( tablename, version ) values ( 'file', 2); -insert into tableversions ( tablename, version ) values ( 'actor', 1); -insert into tableversions ( tablename, version ) values ( 'auditcontributordb', 5); +insert into tableversions ( tablename, version ) values ( 'audit', 5) on conflict do nothing; +insert into tableversions ( tablename, version ) values ( 'file', 2) on conflict do nothing; +insert into tableversions ( tablename, version ) values ( 'actor', 1) on conflict do nothing; +insert into tableversions ( tablename, version ) values ( 'auditcontributordb', 5) on conflict do nothing; --*************************************************************************-- -- Name: file @@ -45,13 +45,13 @@ insert into tableversions ( tablename, version ) values ( 'auditcontributordb', -- Purpose: Keeps track of the different file ids. -- Expected entry count: A lot. Though not as many as 'audittrail'. --*************************************************************************-- -CREATE TABLE file ( +CREATE TABLE IF NOT EXISTS file ( file_guid SERIAL PRIMARY KEY, -- The guid for the file id. fileid VARCHAR(255), -- The actual file id. collectionid VARCHAR(255) -- The collection for the file id. ); -CREATE INDEX fileindex ON file ( fileid, collectionid ); +CREATE INDEX IF NOT EXISTS fileindex ON file ( fileid, collectionid ); --*************************************************************************-- -- Name: actor @@ -59,12 +59,12 @@ CREATE INDEX fileindex ON file ( fileid, collectionid ); -- Purpose: Keeps track of the different actors. -- Expected entry count: Some, though not many. --*************************************************************************-- -CREATE TABLE actor ( +CREATE TABLE IF NOT EXISTS actor ( actor_guid SERIAL PRIMARY KEY, -- The guid for the actor. actor_name VARCHAR(255) UNIQUE -- The name of the actor. ); -CREATE INDEX actorindex ON actor ( actor_name ); +CREATE INDEX IF NOT EXISTS actorindex ON actor ( actor_name ); --*************************************************************************-- -- Name: audittrail @@ -74,7 +74,7 @@ CREATE INDEX actorindex ON actor ( actor_name ); -- Purpose: Keeps track of the different audits. -- Expected entry count: Very, very many. --*************************************************************************-- -CREATE TABLE audittrail ( +CREATE TABLE IF NOT EXISTS audittrail ( sequence_number SERIAL PRIMARY KEY, -- The sequence number and unique key for this table. file_guid INT, -- The identifier for the file. Used to lookup in the file table. @@ -92,5 +92,5 @@ CREATE TABLE audittrail ( -- Foreign key constraint for enforcing relationship ); -CREATE INDEX dateindex ON audittrail ( operation_date ); -CREATE INDEX fileidindex ON audittrail ( file_guid ); +CREATE INDEX IF NOT EXISTS dateindex ON audittrail ( operation_date ); +CREATE INDEX IF NOT EXISTS fileidindex ON audittrail ( file_guid ); diff --git a/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate2to3.sql b/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate2to3.sql index 3bedc403c..dc2c2e625 100644 --- a/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate2to3.sql +++ b/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate2to3.sql @@ -27,5 +27,5 @@ ALTER TABLE audittrail ALTER COLUMN information TYPE TEXT; ALTER TABLE audittrail ALTER COLUMN audit TYPE TEXT; -- Set the table versions -insert into tableversions ( tablename, version ) values ( 'auditcontributordb', 3); +insert into tableversions ( tablename, version ) values ( 'auditcontributordb', 3) on conflict do nothing; update tableversions set version = 3 where tablename = 'audittrail'; diff --git a/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate3to4.sql b/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate3to4.sql index 52e9bff95..c3e32cf13 100644 --- a/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate3to4.sql +++ b/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate3to4.sql @@ -20,9 +20,9 @@ -- #L% --- -ALTER TABLE audittrail ADD operationID VARCHAR(100); -ALTER TABLE audittrail ADD fingerprint VARCHAR(100); +ALTER TABLE IF EXISTS audittrail ADD operationID VARCHAR(100); +ALTER TABLE IF EXISTS audittrail ADD fingerprint VARCHAR(100); -- Set the table versions -insert into tableversions ( tablename, version ) values ( 'auditcontributordb', 4); +insert into tableversions ( tablename, version ) values ( 'auditcontributordb', 4) on conflict do NOTHING; update tableversions set version = 4 where tablename = 'audit'; diff --git a/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate4to5.sql b/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate4to5.sql index bd77e74ce..4d2076df6 100644 --- a/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate4to5.sql +++ b/bitrepository-service/src/main/resources/sql/postgres/auditContributorDBUpdate4to5.sql @@ -25,16 +25,16 @@ UPDATE tableversions SET version = 5 WHERE tablename = 'audit'; UPDATE tableversions SET version = 5 WHERE tablename = 'auditcontributordb'; -- migrate the audittrail table -ALTER TABLE audittrail ADD COLUMN operation_date2 BIGINT; +ALTER TABLE IF EXISTS audittrail ADD COLUMN operation_date2 BIGINT; -DROP INDEX dateindex; +DROP INDEX IF EXISTS dateindex; UPDATE audittrail SET operation_date2 = (EXTRACT (epoch FROM operation_date AT TIME ZONE (SELECT current_setting('TIMEZONE'))) * 1000); -ALTER TABLE audittrail DROP COLUMN operation_date; +ALTER TABLE IF EXISTS audittrail DROP COLUMN operation_date; -ALTER TABLE audittrail RENAME COLUMN operation_date2 TO operation_date; +ALTER TABLE IF EXISTS audittrail RENAME COLUMN operation_date2 TO operation_date; -ALTER TABLE audittrail ALTER COLUMN operation_date SET NOT NULL; +ALTER TABLE IF EXISTS audittrail ALTER COLUMN operation_date SET NOT NULL; -CREATE INDEX dateindex ON audittrail ( operation_date ); +CREATE INDEX IF NOT EXISTS dateindex ON audittrail ( operation_date ); diff --git a/bitrepository-service/src/test/java/org/bitrepository/service/ContributorTest.java b/bitrepository-service/src/test/java/org/bitrepository/service/ContributorIT.java similarity index 85% rename from bitrepository-service/src/test/java/org/bitrepository/service/ContributorTest.java rename to bitrepository-service/src/test/java/org/bitrepository/service/ContributorIT.java index 95cd95f1e..f8b8ad29d 100644 --- a/bitrepository-service/src/test/java/org/bitrepository/service/ContributorTest.java +++ b/bitrepository-service/src/test/java/org/bitrepository/service/ContributorIT.java @@ -28,7 +28,7 @@ /** * Contains the general functionality for creating contributor tests. */ -public abstract class ContributorTest extends IntegrationTest { +public abstract class ContributorIT extends IntegrationTest { protected static final String DEFAULT_FILE_ID = ClientTestMessageFactory.FILE_ID_DEFAULT; protected static String clientDestinationId; @@ -42,13 +42,11 @@ protected void registerMessageReceivers() { super.registerMessageReceivers(); clientDestinationId = settingsForTestClient.getReceiverDestinationID(); - clientReceiver = new MessageReceiver(clientDestinationId); - addReceiver(clientReceiver); + clientReceiver = addReceiver(new MessageReceiver(clientDestinationId)); contributorDestinationId = settingsForCUT.getCollectionDestination() + "-" + getContributorID() + "-" + getTopicPostfix(); - contributorReceiver = new MessageReceiver(contributorDestinationId + " topic receiver"); - addReceiver(contributorReceiver); + contributorReceiver = addReceiver(new MessageReceiver(contributorDestinationId + " topic receiver")); } protected abstract String getContributorID(); diff --git a/bitrepository-service/src/test/java/org/bitrepository/service/audit/AuditTrailContributorDatabaseTest.java b/bitrepository-service/src/test/java/org/bitrepository/service/audit/AuditTrailContributorDatabaseTest.java index 8f39fb488..257a8f558 100644 --- a/bitrepository-service/src/test/java/org/bitrepository/service/audit/AuditTrailContributorDatabaseTest.java +++ b/bitrepository-service/src/test/java/org/bitrepository/service/audit/AuditTrailContributorDatabaseTest.java @@ -27,12 +27,15 @@ import org.bitrepository.common.utils.CalendarUtils; import org.bitrepository.service.database.DatabaseCreator; import org.bitrepository.service.database.DatabaseManager; -import org.bitrepository.service.database.DerbyDatabaseDestroyer; import org.bitrepository.settings.referencesettings.DatabaseSpecifics; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.testcontainers.containers.BindMode; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import java.time.Instant; import java.time.OffsetDateTime; @@ -44,6 +47,7 @@ * Run audit trail contributor database test using Derby. Generates Allure reports. */ +@Testcontainers class AuditTrailContributorDatabaseTest { private Settings settings; private DatabaseSpecifics databaseSpecifics; @@ -57,18 +61,23 @@ class AuditTrailContributorDatabaseTest { private static final String FILE_ID_1 = "FILE-ID-1"; private static final String FILE_ID_2 = "FILE-ID-2"; + @Container + static PostgreSQLContainer postgreSQLContainer = + new PostgreSQLContainer("postgres:18-alpine") + .withClasspathResourceMapping("sql/postgres/auditContributorDBCreation.sql", + "/docker-entrypoint-initdb.d/init.sql", + BindMode.READ_ONLY); + @BeforeEach void setup() throws Exception { settings = TestSettingsProvider.reloadSettings(getClass().getSimpleName()); databaseSpecifics = new DatabaseSpecifics(); - databaseSpecifics.setDriverClass("org.apache.derby.jdbc.EmbeddedDriver"); - databaseSpecifics.setDatabaseURL("jdbc:derby:target/test/auditcontributerdb"); - - DerbyDatabaseDestroyer.deleteDatabase(databaseSpecifics); + databaseSpecifics.setDriverClass(postgreSQLContainer.getDriverClassName()); + databaseSpecifics.setDatabaseURL(postgreSQLContainer.getJdbcUrl()); + databaseSpecifics.setUsername(postgreSQLContainer.getUsername()); + databaseSpecifics.setPassword(postgreSQLContainer.getPassword()); - TestAuditTrailContributorDBCreator dbCreator = new TestAuditTrailContributorDBCreator(); - dbCreator.createAuditTrailContributorDatabase(databaseSpecifics); firstCollectionID = settings.getCollections().get(0).getID(); } @@ -337,7 +346,7 @@ void testAuditTrailDatabaseIngest() throws Exception { */ private static class TestAuditTrailContributorDBCreator extends DatabaseCreator { - public static final String DEFAULT_AUDIT_TRAIL_DB_SCRIPT = "sql/derby/auditContributorDBCreation.sql"; + public static final String DEFAULT_AUDIT_TRAIL_DB_SCRIPT = "sql/postgres/auditContributorDBCreation.sql"; public void createAuditTrailContributorDatabase(DatabaseSpecifics databaseSpecifics) { createDatabase(databaseSpecifics, DEFAULT_AUDIT_TRAIL_DB_SCRIPT); diff --git a/bitrepository-webclient/pom.xml b/bitrepository-webclient/pom.xml index 940f4bcc1..196a3880d 100644 --- a/bitrepository-webclient/pom.xml +++ b/bitrepository-webclient/pom.xml @@ -12,41 +12,29 @@ - javax - javaee-web-api - ${javaee.web.version} - provided - - - javax.servlet - javax.servlet-api - ${javax.servlet.version} + jakarta.servlet + jakarta.servlet-api provided org.apache.cxf cxf-rt-transports-http - ${cxf.version} org.apache.cxf cxf-rt-rs-client - ${cxf.version} com.fasterxml.jackson.core jackson-databind - ${jackson.version} - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson.version} + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider jakarta.ws.rs jakarta.ws.rs-api - ${jakarta.ws.rs.version} org.bitrepository.reference @@ -60,11 +48,6 @@ io.qameta.allure allure-maven - 2.12.0 - - ${project.basedir}/allure-results - ${project.basedir}/allure-report - maven-war-plugin diff --git a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/Reposervice.java b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/Reposervice.java index c7ecf31de..b26cf904e 100644 --- a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/Reposervice.java +++ b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/Reposervice.java @@ -29,11 +29,11 @@ import org.bitrepository.settings.repositorysettings.Collection; import org.bitrepository.settings.repositorysettings.ProtocolSettings; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.io.StringWriter; import java.util.List; diff --git a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/ReposerviceRestApplication.java b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/ReposerviceRestApplication.java index 9e35cfee2..189521984 100644 --- a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/ReposerviceRestApplication.java +++ b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/ReposerviceRestApplication.java @@ -1,8 +1,8 @@ package org.bitrepository.webservice; -import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; -import javax.ws.rs.core.Application; +import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider; +import jakarta.ws.rs.core.Application; import java.util.Arrays; import java.util.HashSet; import java.util.Set; diff --git a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/ServiceUrl.java b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/ServiceUrl.java index 246d7ca5c..6a7aac918 100644 --- a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/ServiceUrl.java +++ b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/ServiceUrl.java @@ -21,13 +21,13 @@ */ package org.bitrepository.webservice; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; diff --git a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebCollection.java b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebCollection.java index a43b26b3d..7ce1b3f4f 100644 --- a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebCollection.java +++ b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebCollection.java @@ -21,8 +21,8 @@ */ package org.bitrepository.webservice; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class WebCollection { diff --git a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebclientContextListener.java b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebclientContextListener.java index 6ac633478..6982cebd3 100644 --- a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebclientContextListener.java +++ b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebclientContextListener.java @@ -5,43 +5,42 @@ * Copyright (C) 2010 - 2012 The State and University Library, The Royal Library and The State Archives, Denmark * %% * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public + * + * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * . * #L% */ package org.bitrepository.webservice; +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; import org.bitrepository.BasicClient; import org.bitrepository.BasicClientFactory; import org.bitrepository.utils.LogbackConfigLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; - /** * The Listener has two intentions - * 1) Acquire necessary information at startup to locate configuration files and create the first instance - * of the basic client, so everything is setup before the first users start using the webservice. - * 2) In time shut the service down in a proper manner, so no threads will be orphaned. + * 1) Acquire necessary information at startup to locate configuration files and create the first instance + * of the basic client, so everything is setup before the first users start using the webservice. + * 2) In time shut the service down in a proper manner, so no threads will be orphaned. */ public class WebclientContextListener implements ServletContextListener { private final Logger log = LoggerFactory.getLogger(getClass()); /** - * Do initialization work + * Do initialization work */ @SuppressWarnings("unused") @Override @@ -55,20 +54,20 @@ public void contextInitialized(ServletContextEvent sce) { new LogbackConfigLoader(confDir + "/logback.xml"); } catch (Exception e) { log.info("Failed to read log configuration file. Falling back to default."); - } + } BasicClientFactory.init(confDir); BasicClient client = BasicClientFactory.getInstance(); log.debug("Servlet context initialized"); } /** - * Does work of shutting the webclient down in a graceful manner. - * This is done by calling BasicClient's shutdown method. + * Does work of shutting the webclient down in a graceful manner. + * This is done by calling BasicClient's shutdown method. */ @Override public void contextDestroyed(ServletContextEvent sce) { BasicClient client = BasicClientFactory.getInstance(); - client.shutdown(); + client.shutdown(); log.debug("Servlet context destroyed"); } } diff --git a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebserviceIllegalArgumentException.java b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebserviceIllegalArgumentException.java index 9e842fc03..371afe60a 100644 --- a/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebserviceIllegalArgumentException.java +++ b/bitrepository-webclient/src/main/java/org/bitrepository/webservice/WebserviceIllegalArgumentException.java @@ -21,9 +21,9 @@ */ package org.bitrepository.webservice; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; @SuppressWarnings("serial") public class WebserviceIllegalArgumentException extends WebApplicationException { diff --git a/bitrepository-webclient/src/main/webapp/WEB-INF/web.xml b/bitrepository-webclient/src/main/webapp/WEB-INF/web.xml index 3954fafe6..6ed8567a4 100644 --- a/bitrepository-webclient/src/main/webapp/WEB-INF/web.xml +++ b/bitrepository-webclient/src/main/webapp/WEB-INF/web.xml @@ -33,7 +33,7 @@ Bitrepository-webclient org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet - javax.ws.rs.Application + jakarta.ws.rs.Application org.bitrepository.webservice.ReposerviceRestApplication diff --git a/pom.xml b/pom.xml index f9bbb8ea8..3e0015d08 100644 --- a/pom.xml +++ b/pom.xml @@ -1,604 +1,792 @@ - 4.0.0 - org.bitrepository.reference - bitrepository-parent - 1.12-SNAPSHOT + 4.0.0 + org.bitrepository.reference + bitrepository-parent + 1.12-SNAPSHOT - - org.sbforge - sbforge-parent - 22 - + + org.sbforge + sbforge-parent + 25 + - Bitrepository + Bitrepository - pom + pom - - bitrepository-reference-settings - bitrepository-core - bitrepository-client - bitrepository-service - bitrepository-integrity-service - bitrepository-alarm-service - bitrepository-audit-trail-service - bitrepository-reference-pillar - bitrepository-monitoring-service - bitrepository-integration - bitrepository-webclient - + + bitrepository-reference-settings + bitrepository-core + bitrepository-client + bitrepository-service + bitrepository-integrity-service + bitrepository-alarm-service + bitrepository-audit-trail-service + bitrepository-reference-pillar + bitrepository-monitoring-service + bitrepository-integration + bitrepository-webclient + - - - sbforge-nexus - https://sbforge.org/nexus/content/groups/public - - true - - - true - - - + + + sbforge-nexus + https://sbforge.org/nexus/content/groups/public + + true + + + true + + + - - - Mikis Seth Sørensen - mss - - Former Employee - - - - Kim Agerbo Christensen - ktc - - Former Employee - - - - Jonas Lindberg Frellesen - jolf - - Former Employee - - - - Asger Askov Blekinge - asga@kb.dk - The Danish Royal Library - https://www.kb.dk/en - - Developer - - - - Rasmus Bohl Kristensen - rbkr@kb.dk - The Danish Royal Library - https://www.kb.dk/en - - Developer - - - - Mathias Søby Jensen - masj@kb.dk - The Danish Royal Library - https://www.kb.dk/en - - Developer - - - + + + Mikis Seth Sørensen + mss + + Former Employee + + + + Kim Agerbo Christensen + ktc + + Former Employee + + + + Jonas Lindberg Frellesen + jolf + + Former Employee + + + + Asger Askov Blekinge + asga@kb.dk + The Danish Royal Library + https://www.kb.dk/en + + Developer + + + + Rasmus Bohl Kristensen + rbkr@kb.dk + The Danish Royal Library + https://www.kb.dk/en + + Developer + + + + Mathias Søby Jensen + masj@kb.dk + The Danish Royal Library + https://www.kb.dk/en + + Developer + + + - 2010 + 2010 - - - LGPL v2.1 - repo - http://www.gnu.org/licenses/lgpl-2.1.txt - - + + + LGPL v2.1 + repo + http://www.gnu.org/licenses/lgpl-2.1.txt + + - - JIRA - https://sbforge.org/jira/browse/BITMAG - + + JIRA + https://sbforge.org/jira/browse/BITMAG + - - Jenkins - https://sbforge.org/jenkins/ - + + Jenkins + https://sbforge.org/jenkins/ + - The Bit Repository system enables long-term preservation of data in a distributed, highly redundant - architecture. The data integrity is ensured by using multiple, independently developed data storage systems - (Pillars) - across different organizations, together with functionality for maintaining the integrity of the data over - time. - - https://sbforge.org/display/BITMAG + The Bit Repository system enables long-term preservation of data in a distributed, highly redundant + architecture. The data integrity is ensured by using multiple, independently developed data storage systems + (Pillars) + across different organizations, together with functionality for maintaining the integrity of the data over + time. + + https://sbforge.org/display/BITMAG - - The State and University Library, The Royal Library and The State Archives, Denmark - https://sbforge.org/display/BITMAG - + + The State and University Library, The Royal Library and The State Archives, Denmark + https://sbforge.org/display/BITMAG + - - https://sbforge.org/fisheye/browse/bitrepository-reference - scm:git:git@github.com:bitrepository/reference.git - scm:git:git@github.com:bitrepository/reference.git - HEAD - + + https://sbforge.org/fisheye/browse/bitrepository-reference + scm:git:git@github.com:bitrepository/reference.git + scm:git:git@github.com:bitrepository/reference.git + HEAD + - - - - io.qameta.allure - allure-bom - 2.32.0 - pom - import - - - org.slf4j - slf4j-api - 2.0.17 - - - + - - org.slf4j - slf4j-api - ${slf4j.version} - - - ch.qos.logback - logback-classic - 1.5.32 - - - - ch.qos.logback - logback-core - 1.5.32 - - - - org.jvnet.jaxb2_commons - jaxb2-basics-runtime - 0.11.1 - - - - - jakarta.xml.bind - jakarta.xml.bind-api - 2.3.3 - - - - jakarta.activation - jakarta.activation-api - 1.2.2 - - - - org.glassfish.jaxb - jaxb-runtime - 2.3.6 - runtime - - - org.junit.jupiter - junit-jupiter - 5.13.4 - test - - - org.junit.platform - junit-platform-suite-engine - 1.13.4 - test - - - org.mockito - mockito-core - 3.3.3 - test - - - - org.slf4j - jul-to-slf4j - ${slf4j.version} - - - org.slf4j - log4j-over-slf4j - ${slf4j.version} - - - org.slf4j - jcl-over-slf4j - ${slf4j.version} - - - - io.qameta.allure - allure-junit5 - 2.32.0 - test - - - org.aspectj - aspectjweaver - ${aspectj.version} - + + + jakarta.platform + jakarta.jakartaee-bom + 11.0.0 + pom + import + + + org.apache.cxf + cxf-bom + 4.2.0 + pom + import + + + com.fasterxml.jackson + jackson-bom + 2.21.4 + pom + import + + + org.bouncycastle + bc-jdk18on-bom + 1.84 + pom + import + + + org.apache.httpcomponents + httpclient + 4.5.14 + + + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.5 + + + org.glassfish.jaxb + jaxb-runtime + 4.0.9 + + + + + org.apache.artemis + artemis-bom + 2.55.0 + pom + import + + + org.apache.activemq + activemq-bom + 6.2.7 + pom + import + + + org.apache.activemq + activemq-broker + 6.2.7 + + + + + + org.slf4j + slf4j-bom + 2.0.18 + pom + import + + + ch.qos.logback + logback-classic + 1.5.34 + + + ch.qos.logback + logback-core + 1.5.34 + + + + io.qameta.allure + allure-bom + 2.32.0 + pom + import + + + org.testcontainers + testcontainers-bom + 2.0.5 + pom + import + + + org.mockito + mockito-bom + 5.23.0 + pom + import + + + org.junit + junit-bom + 5.14.4 + pom + import + + + org.eclipse.jetty + jetty-server + 12.1.8 + + + org.hamcrest + hamcrest-core + 3.0 + + + + + commons-io + commons-io + 2.21.0 + + + commons-codec + commons-codec + 1.21.0 + + + commons-cli + commons-cli + 1.4 + + + org.jetbrains + annotations + 23.0.0 + compile + + + org.jvnet.jaxb + jaxb-plugins-runtime + ${jaxb.version} + + + javax.mail + javax.mail-api + 1.6.2 + + + org.aspectj + aspectjweaver + 1.9.25.1 + + + + + com.mchange + c3p0 + 0.12.0 + + + org.postgresql + postgresql + 42.7.8 + + + org.apache.derby + derby + 10.17.1.0 + + + org.apache.derby + derbyclient + 10.17.1.0 + + + org.apache.derby + derbynet + 10.17.1.0 + + + org.apache.derby + derbytools + 10.17.1.0 + + + + + org.bitrepository.message-xml + message-xml-xsd + ${message.xml.version} + + + org.bitrepository.message-xml + message-xml-java + ${message.xml.version} + + + org.bitrepository.repository-settings + repository-settings-xsd + ${repository.settings.version} + + + org.bitrepository.repository-settings + repository-settings-java + ${repository.settings.version} + + - - - - io.qameta.allure - allure-maven - ${allure.version} - - 2.20.1 - ${project.basedir}/target/site/allure-maven-plugin - ${project.basedir}/target/allure-results - - - - org.apache.maven.plugins - maven-enforcer-plugin - 3.0.0-M3 - - - enforce-maven - - enforce - - - - - 2.2.1 - - - - - - - - org.codehaus.mojo - license-maven-plugin - - true - true - true - lgpl_v2_1 - true - false - - **/*.java - **/*.xsd - **/*.sql - - - xml - - - + + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + + + ch.qos.logback + logback-core + + + jakarta.xml.bind + jakarta.xml.bind-api + + + jakarta.activation + jakarta.activation-api + + + org.glassfish.jaxb + jaxb-runtime + runtime + - - maven-surefire-plugin - - regressiontest - random - - - - maven-jar-plugin - - - - true - true - - - value - - - true - - - - - test-jar - - - - - - maven-release-plugin - - - true - - - - maven-war-plugin - - - - WEB-INF/lib/commons-logging-*.jar, - %regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar] - - false - - - - org.jacoco - jacoco-maven-plugin - 0.8.12 - - - - prepare-agent - - - - report - test - - report - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - - properties - - - - - - de.thetaphi - forbiddenapis - 3.8 - - ${maven.compiler.release} - false - - jdk-unsafe - jdk-deprecated - jdk-non-portable - jdk-reflection - - - - - ${api.check.phase} - - check - testCheck - - - - - - - - - org.codehaus.mojo - license-maven-plugin - 2.0.0 - - - maven-compiler-plugin - 3.15.0 - - - maven-source-plugin - 3.2.1 - - - maven-javadoc-plugin - 3.2.0 - - - maven-release-plugin - 3.0.0-M1 - - - maven-jar-plugin - 3.2.0 - - - maven-surefire-plugin - 3.5.4 - - - ${project.basedir}/../target/allure-results - - + + org.aspectj + aspectjweaver + + + + org.junit.jupiter + junit-jupiter + test + + + org.junit.platform + junit-platform-suite-engine + test + + + org.mockito + mockito-core + test + + + + org.slf4j + jul-to-slf4j + + + org.slf4j + log4j-over-slf4j + + + org.slf4j + jcl-over-slf4j + + + + io.qameta.allure + allure-junit5 + test + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.6.2 + + + enforce-maven + + enforce + + + + + 3.9.1 + + + + + + + + org.codehaus.mojo + license-maven-plugin + + true + true + true + lgpl_v2_1 + true + false + + **/*.java + **/*.xsd + **/*.sql + + + xml + + + + + + maven-surefire-plugin + + regressiontest + random + + + + org.apache.maven.plugins + maven-failsafe-plugin + true + + + maven-release-plugin + + + true + + + + maven-war-plugin + + + + WEB-INF/lib/commons-logging-*.jar, + %regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar] + + false + + + + org.jacoco + jacoco-maven-plugin + 0.8.14 + + + + prepare-agent + + + + report + test + + report + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + + properties + + + + + + de.thetaphi + forbiddenapis + 3.10 + + ${maven.compiler.release} + false + + jdk-unsafe + jdk-deprecated + jdk-non-portable + jdk-reflection + + + + + ${api.check.phase} + + check + testCheck + + + + + + + + + io.qameta.allure + allure-maven + 2.17.0 + + 2.20.1 + ${project.basedir}/target/site/allure-maven-plugin + ${project.basedir}/target/allure-results + + + + org.codehaus.mojo + license-maven-plugin + 2.7.1 + + + maven-compiler-plugin + 3.15.0 + + + maven-source-plugin + 3.4.0 + + + maven-javadoc-plugin + 3.12.0 + + + maven-release-plugin + 3.3.1 + + + maven-jar-plugin + 3.5.0 + + + + true + true + + + value + + + true + + + + + test-jar + + + prepare-package + + + false + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.6 + + + ${project.basedir}/../target/allure-results + + - @{argLine} -javaagent:${org.aspectj:aspectjweaver:jar} - - - - maven-failsafe-plugin - 3.5.4 - - - maven-war-plugin - 3.3.0 - - - maven-assembly-plugin - 3.3.0 - - - maven-resources-plugin - 3.1.0 - - - maven-remote-resources-plugin - 1.7.0 - - - maven-clean-plugin - 3.1.0 - - - maven-install-plugin - 3.0.0-M1 - - - maven-deploy-plugin - 3.0.0-M1 - - - maven-dependency-plugin - 3.1.2 - - - org.codehaus.mojo - jaxb2-maven-plugin - 2.5.0 - - - org.apache.tomcat.maven - tomcat7-maven-plugin - 2.2 - - - org.codehaus.mojo - exec-maven-plugin - 3.0.0 - - - de.thetaphi - forbiddenapis - 3.8 - - - - + @{argLine} -javaagent:${org.aspectj:aspectjweaver:jar} + +
    + + maven-failsafe-plugin + 3.5.6 + + + + integration-test + verify + + + + + + maven-war-plugin + 3.5.1 + + + maven-assembly-plugin + 3.8.0 + + + maven-resources-plugin + 3.5.0 + + + maven-remote-resources-plugin + 3.3.0 + + + maven-clean-plugin + 3.5.0 + + + maven-install-plugin + 3.1.4 + + + maven-deploy-plugin + 3.1.4 + + + maven-dependency-plugin + 3.10.0 + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + + org.codehaus.mojo + exec-maven-plugin + 3.6.3 + + + de.thetaphi + forbiddenapis + 3.10 + + + + - + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.9.0 + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.6.0 + + sonarCheckstyle.xml + + + + com.github.spotbugs + spotbugs-maven-plugin + 4.9.8.2 + + false + + + + org.jacoco + jacoco-maven-plugin + 0.8.14 + + + org.apache.maven.plugins + maven-pmd-plugin + 3.28.0 + + + + + + + deploy + - - org.apache.maven.plugins - maven-project-info-reports-plugin - 3.4.5 - - - org.apache.maven.plugins - maven-checkstyle-plugin - 3.6.0 - - sonarCheckstyle.xml - - - - com.github.spotbugs - spotbugs-maven-plugin - 4.0.0 - - false - - - - org.jacoco - jacoco-maven-plugin - 0.8.12 - - - org.apache.maven.plugins - maven-pmd-plugin - 3.26.0 - + + maven-source-plugin + + + attach-sources + + jar + + + + + + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + - - - - - deploy - - - - maven-source-plugin - - - attach-sources - - jar - - - - - - maven-javadoc-plugin - - - attach-javadocs - - jar - - - - - - - - - skip-unit-tests - - - - - - + + + + skip-unit-tests + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + + - - - 21 - process-classes - 31 - 14 - 10.17.1.0 - 6.2.4 - 2.54.0 - 4.2.0 - 2.21.2 - 2.1.6 - 8.0.1 - 4.0.1 - 2.0.17 - dav:https://sbforge.org/maven/bitrepository/sites/reference/${project.version} - - UTF-8 - 1.9.22.1 - 2.17.0 - + + + 21 + process-classes + 33-SNAPSHOT + 15-SNAPSHOT + 4.0.12 + dav:https://sbforge.org/maven/bitrepository/sites/reference/${project.version} + + UTF-8 +