diff --git a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/LocalAuditTrailPreserver.java b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/LocalAuditTrailPreserver.java index 00b774cfc..041bde76a 100644 --- a/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/LocalAuditTrailPreserver.java +++ b/bitrepository-audit-trail-service/src/main/java/org/bitrepository/audittrails/preserver/LocalAuditTrailPreserver.java @@ -21,6 +21,7 @@ */ package org.bitrepository.audittrails.preserver; +import org.apache.commons.codec.DecoderException; import org.bitrepository.common.TimerTaskSchedule; import org.bitrepository.audittrails.store.AuditTrailStore; import org.bitrepository.audittrails.webservice.PreservationInfo; @@ -185,13 +186,15 @@ private synchronized void performAuditTrailPreservation(String collectionID) { throw new CoordinationLayerException("Cannot perform the preservation of audit trails.", e); } catch (OperationFailedException e) { throw new CoordinationLayerException("Failed to put the packed audit trails.", e); + } catch (DecoderException e) { + throw new CoordinationLayerException("Failed to encode the checksum.", e); } } /** * Helper method to make a checksum for the PutFile call. */ - private ChecksumDataForFileTYPE getValidationChecksumDataForFile(File file) { + private ChecksumDataForFileTYPE getValidationChecksumDataForFile(File file) throws DecoderException { ChecksumSpecTYPE csSpec = ChecksumUtils.getDefault(settings); String checksum = ChecksumUtils.generateChecksum(file, csSpec); 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 eff5dba1d..c4cf0dbc2 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/CommandLineClient.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/CommandLineClient.java @@ -24,6 +24,7 @@ import org.apache.commons.cli.Option; import org.apache.commons.cli.ParseException; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.commandline.output.DefaultOutputHandler; @@ -48,16 +49,17 @@ import java.net.URL; import java.security.NoSuchAlgorithmException; import java.util.List; +import java.util.Locale; /** * Defines the common functionality for command-line-clients. */ public abstract class CommandLineClient { private final String componentID; - protected final OutputHandler output = new DefaultOutputHandler(getClass()); - protected final Settings settings; - protected final SecurityManager securityManager; - protected final CommandLineArgumentsHandler cmdHandler; + protected OutputHandler output = new DefaultOutputHandler(getClass()); + protected Settings settings; + protected SecurityManager securityManager; + protected CommandLineArgumentsHandler cmdHandler; private final FileIDValidator fileIDValidator; /** @@ -132,7 +134,7 @@ protected String getComponentID() { protected abstract boolean isFileIDArgumentRequired(); /** - * Creates the options for the command line argument handler. May be override. + * Creates the options for the command line argument handler. May be overridden. */ protected void createOptionsForCmdArgumentHandler() { cmdHandler.createDefaultOptions(); @@ -159,15 +161,17 @@ protected void validateArguments() { String collectionArgument = cmdHandler.getOptionValue(Constants.COLLECTION_ID_ARG); if (!collections.contains(collectionArgument)) { throw new IllegalArgumentException( - collectionArgument + " is not a valid collection." + "\nThe following collections are defined: " + collections); + String.format(Locale.ROOT, "'%s' is not a valid collection.\nValid collections are:\n%s", + collectionArgument, collections)); } } if (cmdHandler.hasOption(Constants.PILLAR_ARG)) { String pillarArgument = cmdHandler.getOptionValue(Constants.PILLAR_ARG); List pillarsInCollection = SettingsUtils.getPillarIDsForCollection(getCollectionID()); if (!pillarsInCollection.contains(pillarArgument)) { - throw new IllegalArgumentException(pillarArgument + " is not a valid pillar for collection " + getCollectionID() + - "\nThe collection contains the following pillars: " + pillarsInCollection); + throw new IllegalArgumentException(String.format(Locale.ROOT, + "'%s' is not a valid pillar for collection '%s'\nAvailable pillars for the collection are:\n%s", pillarArgument, + getCollectionID(), pillarsInCollection)); } } } @@ -240,17 +244,16 @@ protected ChecksumSpecTYPE getRequestChecksumSpecOrNull() { */ private ChecksumSpecTYPE getRequestChecksumSpec() { ChecksumSpecTYPE res = new ChecksumSpecTYPE(); - res.setChecksumType(ChecksumExtractionUtils.extractChecksumType(cmdHandler, settings, output)); - - if (cmdHandler.hasOption(Constants.REQUEST_CHECKSUM_SALT_ARG)) { - res.setChecksumSalt(Base16Utils.encodeBase16(cmdHandler.getOptionValue(Constants.REQUEST_CHECKSUM_SALT_ARG))); - } - try { + res.setChecksumType(ChecksumExtractionUtils.extractChecksumType(cmdHandler, settings, output)); + + if (cmdHandler.hasOption(Constants.REQUEST_CHECKSUM_SALT_ARG)) { + res.setChecksumSalt(Base16Utils.encodeBase16(cmdHandler.getOptionValue(Constants.REQUEST_CHECKSUM_SALT_ARG))); + } ChecksumUtils.verifyAlgorithm(res); - } catch (NoSuchAlgorithmException e) { - output.error("Invalid checksum algorithm: " + e.getMessage()); - throw new IllegalStateException("Invalid checksumSpec for '" + res + "'", e); + } catch (NoSuchAlgorithmException | DecoderException | IllegalStateException e) { + output.error(e.getMessage()); + System.exit(1); } return res; @@ -288,8 +291,13 @@ protected ChecksumDataForFileTYPE getChecksumDataForDeleteValidation() { ChecksumDataForFileTYPE res = new ChecksumDataForFileTYPE(); res.setCalculationTimestamp(CalendarUtils.getNow()); + try { + res.setChecksumValue(Base16Utils.encodeBase16(cmdHandler.getOptionValue(Constants.CHECKSUM_ARG))); + } catch (DecoderException e) { + output.error(e.getMessage()); + System.exit(1); + } res.setChecksumSpec(ChecksumUtils.getDefault(settings)); - res.setChecksumValue(Base16Utils.encodeBase16(cmdHandler.getOptionValue(Constants.CHECKSUM_ARG))); return res; } @@ -304,8 +312,7 @@ protected void deleteFileAfterwards(URL url) { FileExchange fileexchange = ProtocolComponentFactory.getInstance().getFileExchange(settings); fileexchange.deleteFile(url); } catch (Exception e) { - System.err.println("Issue regarding removing file from server: " + e.getMessage()); - e.printStackTrace(); + output.error("Issue regarding removing file from server: " + e.getMessage()); } } @@ -351,12 +358,18 @@ protected long getSizeOfFileOrZero() { */ protected ChecksumDataForFileTYPE getValidationChecksumDataForFile(File file) { ChecksumSpecTYPE csSpec = ChecksumUtils.getDefault(settings); + String checksum = ChecksumUtils.generateChecksum(file, csSpec); ChecksumDataForFileTYPE res = new ChecksumDataForFileTYPE(); res.setCalculationTimestamp(CalendarUtils.getNow()); res.setChecksumSpec(csSpec); - res.setChecksumValue(Base16Utils.encodeBase16(checksum)); + try { + res.setChecksumValue(Base16Utils.encodeBase16(checksum)); + } catch (DecoderException e) { + output.error(e.getMessage()); + System.exit(1); + } return res; } @@ -378,7 +391,12 @@ protected ChecksumDataForFileTYPE getValidationChecksumDataFromArgument(String a ChecksumDataForFileTYPE res = new ChecksumDataForFileTYPE(); res.setCalculationTimestamp(CalendarUtils.getNow()); res.setChecksumSpec(csSpec); - res.setChecksumValue(Base16Utils.encodeBase16(cmdHandler.getOptionValue(arg))); + try { + res.setChecksumValue(Base16Utils.encodeBase16(cmdHandler.getOptionValue(arg))); + } catch (DecoderException e) { + System.exit(1); + } + return res; } diff --git a/bitrepository-client/src/main/java/org/bitrepository/commandline/utils/ChecksumExtractionUtils.java b/bitrepository-client/src/main/java/org/bitrepository/commandline/utils/ChecksumExtractionUtils.java index 1e2035eaf..c325aecd1 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/utils/ChecksumExtractionUtils.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/utils/ChecksumExtractionUtils.java @@ -27,7 +27,11 @@ import org.bitrepository.common.settings.Settings; import org.bitrepository.common.utils.ChecksumUtils; +import java.security.NoSuchAlgorithmException; +import java.util.List; import java.util.Locale; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Utility class for extraction of checksum parameters from the commandline arguments. @@ -44,13 +48,13 @@ public class ChecksumExtractionUtils { * @param output The OutputHandler, where output and logging information is delivered. * @return The checksum type. */ - public static ChecksumType extractChecksumType(CommandLineArgumentsHandler cmdHandler, Settings settings, - OutputHandler output) { + public static ChecksumType extractChecksumType(CommandLineArgumentsHandler cmdHandler, Settings settings, OutputHandler output) + throws NoSuchAlgorithmException { String type; if (cmdHandler.hasOption(Constants.REQUEST_CHECKSUM_TYPE_ARG)) { type = cmdHandler.getOptionValue(Constants.REQUEST_CHECKSUM_TYPE_ARG).toUpperCase(Locale.ROOT); } else { - type = ChecksumUtils.getDefault(settings).getChecksumType().name(); + type = ChecksumUtils.getDefault(settings).getChecksumType().name().toUpperCase(Locale.ROOT); } if (cmdHandler.hasOption(Constants.REQUEST_CHECKSUM_SALT_ARG)) { @@ -65,6 +69,14 @@ public static ChecksumType extractChecksumType(CommandLineArgumentsHandler cmdHa } } - return ChecksumType.fromValue(type); + List availableChecksums = Stream.of(ChecksumType.values()).filter(c -> !c.equals(ChecksumType.OTHER)) + .map(ChecksumType::value).collect(Collectors.toList()); + + if (availableChecksums.contains(type)) { + return ChecksumType.fromValue(type); + } else { + throw new NoSuchAlgorithmException( + "The algorithm '" + type + "' is not valid.\nValid checksum algorithms are:\n" + availableChecksums); + } } } diff --git a/bitrepository-client/src/main/java/org/bitrepository/modify/replacefile/conversation/ReplacingFile.java b/bitrepository-client/src/main/java/org/bitrepository/modify/replacefile/conversation/ReplacingFile.java index 026cebb77..1f85aaba4 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/modify/replacefile/conversation/ReplacingFile.java +++ b/bitrepository-client/src/main/java/org/bitrepository/modify/replacefile/conversation/ReplacingFile.java @@ -31,7 +31,6 @@ import org.bitrepository.client.conversation.ConversationContext; import org.bitrepository.client.conversation.PerformingOperationState; import org.bitrepository.client.conversation.selector.SelectedComponentInfo; -import org.bitrepository.client.exceptions.UnexpectedResponseException; import org.bitrepository.common.utils.ChecksumUtils; import java.util.Collection; @@ -57,7 +56,7 @@ public ReplacingFile(ReplaceFileConversationContext context, Collection Base16Utils.encodeBase16(null)); + + addStep("Test with an odd number of characters.", "Should throw a decoder exception"); + Assert.assertThrows(DecoderException.class, () -> Base16Utils.encodeBase16("123")); + } } diff --git a/bitrepository-core/src/test/java/org/bitrepository/common/utils/TestFileHelper.java b/bitrepository-core/src/test/java/org/bitrepository/common/utils/TestFileHelper.java index ca41c90cd..3835827a8 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/common/utils/TestFileHelper.java +++ b/bitrepository-core/src/test/java/org/bitrepository/common/utils/TestFileHelper.java @@ -5,22 +5,23 @@ * 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.common.utils; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumType; @@ -48,8 +49,12 @@ public static ChecksumDataForFileTYPE getDefaultFileChecksum() { ChecksumSpecTYPE checksumSpecTYPE = new ChecksumSpecTYPE(); checksumSpecTYPE.setChecksumType(ChecksumType.MD5); checksumData.setChecksumSpec(checksumSpecTYPE); - checksumData.setChecksumValue(Base16Utils.encodeBase16( - ChecksumUtils.generateChecksum(getDefaultFile(), checksumSpecTYPE))); + try { + checksumData.setChecksumValue(Base16Utils.encodeBase16(ChecksumUtils.generateChecksum(getDefaultFile(), checksumSpecTYPE))); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } + return checksumData; } @@ -58,7 +63,7 @@ public static long getFileSize(File file) { } public static InputStream getFile(String name) { - String fullName = TEST_RESOURCES_PATH+name; + String fullName = TEST_RESOURCES_PATH + name; InputStream fileStream = TestFileHelper.class.getClassLoader().getResourceAsStream(fullName); assert (fileStream != null) : "Unable to find " + fullName + " in classpath"; return fileStream; @@ -71,20 +76,20 @@ public static String createUniquePrefix(String testName) { public static String[] createFileIDs(int numberToCreate, String testName) { String uniquePrefix = createUniquePrefix(testName); String[] fileIDs = new String[numberToCreate]; - for (int i = 0 ; i getAllFilesFromSubDirs(File dir) { List res = new ArrayList<>(); - if(dir.isDirectory()) { - for(File f : dir.listFiles()) { - if(f.isFile()) { + if (dir.isDirectory()) { + for (File f : dir.listFiles()) { + if (f.isFile()) { res.add(f); } else { - for(File sf : getAllFilesFromSubDirs(f)) { + for (File sf : getAllFilesFromSubDirs(f)) { res.add(sf); } } diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/utils/MessageDataTypeValidatorTest.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/utils/MessageDataTypeValidatorTest.java index b17abd7ad..0cb10618d 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/utils/MessageDataTypeValidatorTest.java +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/utils/MessageDataTypeValidatorTest.java @@ -1,5 +1,6 @@ package org.bitrepository.protocol.utils; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumType; @@ -27,7 +28,7 @@ public void validateChecksumDataForFileNoChecksumTest() { } @Test(expectedExceptions = {IllegalArgumentException.class}) - public void validateChecksumDataForFileNoTimestampTest() { + public void validateChecksumDataForFileNoTimestampTest() throws DecoderException { ChecksumDataForFileTYPE noChecksumSpec = new ChecksumDataForFileTYPE(); ChecksumSpecTYPE checksumTypeSpec = new ChecksumSpecTYPE(); checksumTypeSpec.setChecksumType(ChecksumType.MD5); @@ -38,7 +39,7 @@ public void validateChecksumDataForFileNoTimestampTest() { } @Test(expectedExceptions = {IllegalArgumentException.class}) - public void validateChecksumDataForFileNoChecksumSpecTest() { + public void validateChecksumDataForFileNoChecksumSpecTest() throws DecoderException { ChecksumDataForFileTYPE noChecksumSpec = new ChecksumDataForFileTYPE(); noChecksumSpec.setChecksumValue(Base16Utils.encodeBase16("abab")); noChecksumSpec.setCalculationTimestamp(CalendarUtils.getNow()); @@ -47,7 +48,7 @@ public void validateChecksumDataForFileNoChecksumSpecTest() { } //@Test(expectedExceptions = {IllegalArgumentException.class}) - public void validateChecksumDataForFileInvalidChecksumSpecTest() { + public void validateChecksumDataForFileInvalidChecksumSpecTest() throws DecoderException { ChecksumDataForFileTYPE noChecksumSpec = new ChecksumDataForFileTYPE(); ChecksumSpecTYPE checksumTypeSpec = new ChecksumSpecTYPE(); noChecksumSpec.setChecksumSpec(checksumTypeSpec); diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflow.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflow.java index acab1033f..0b675e466 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflow.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/SaltedChecksumWorkflow.java @@ -21,6 +21,7 @@ */ package org.bitrepository.integrityservice.workflow; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumType; import org.bitrepository.bitrepositoryelements.FileAction; @@ -35,7 +36,6 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.UUID; @@ -56,7 +56,6 @@ public class SaltedChecksumWorkflow extends Workflow { protected IntegrityWorkflowContext context; protected String collectionID; protected IntegrityContributors integrityContributors; - protected Date workflowStart; protected WorkflowStep step = null; /** @@ -108,7 +107,7 @@ public void start() { * * @return The actual {@link ChecksumSpecTYPE}. */ - private ChecksumSpecTYPE getChecksumSpecWithRandomSalt() { + private ChecksumSpecTYPE getChecksumSpecWithRandomSalt() throws IllegalArgumentException { ChecksumType defaultChecksum = ChecksumType.valueOf( context.getSettings().getRepositorySettings().getProtocolSettings().getDefaultChecksumType()); ChecksumSpecTYPE res = new ChecksumSpecTYPE(); @@ -131,7 +130,11 @@ private ChecksumSpecTYPE getChecksumSpecWithRandomSalt() { } String salt = UUID.randomUUID().toString().replace("-", ""); - res.setChecksumSalt(Base16Utils.encodeBase16(salt)); + try { + res.setChecksumSalt(Base16Utils.encodeBase16(salt)); + } catch (DecoderException e) { + throw new IllegalArgumentException("Failed to set random salt.", e); + } return res; } diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/PutFileStep.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/PutFileStep.java index 3ccd655b6..49918f8b0 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/PutFileStep.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/workflow/step/PutFileStep.java @@ -21,6 +21,7 @@ */ package org.bitrepository.integrityservice.workflow.step; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE; import org.bitrepository.client.eventhandler.OperationEvent; import org.bitrepository.client.eventhandler.OperationEvent.OperationEventType; @@ -30,6 +31,8 @@ import org.bitrepository.integrityservice.collector.IntegrityEventCompleteAwaiter; import org.bitrepository.integrityservice.workflow.IntegrityWorkflowContext; import org.bitrepository.service.workflow.AbstractWorkFlowStep; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.net.URL; @@ -42,6 +45,7 @@ public class PutFileStep extends AbstractWorkFlowStep { private final String fileId; private final URL uploadUrl; private final String checksum; + private final Logger log = LoggerFactory.getLogger(this.getClass()); /** * @param context The context for the workflow. @@ -70,7 +74,12 @@ public void performStep() { ChecksumDataForFileTYPE checksumValidationData = new ChecksumDataForFileTYPE(); checksumValidationData.setCalculationTimestamp(CalendarUtils.getNow()); checksumValidationData.setChecksumSpec(ChecksumUtils.getDefault(context.getSettings())); - checksumValidationData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + try { + checksumValidationData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + } catch (DecoderException e) { + throw new IllegalStateException(e); + } + context.getCollector() .putFile(collectionId, fileId, uploadUrl, checksumValidationData, eventHandler, "IntegrityService: " + getName()); @@ -78,7 +87,7 @@ public void performStep() { OperationEvent event = eventHandler.getFinish(); if (event.getEventType() == OperationEventType.FAILED) { throw new IllegalStateException( - "Aborting workflow due to failure putting the file '" + fileId + "'. " + "Cause: " + event.toString()); + "Aborting workflow due to failure putting the file '" + fileId + "'. " + "Cause: " + event); } } } 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 77d783d7f..6b66e35fa 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 @@ -24,6 +24,7 @@ */ package org.bitrepository.integrityservice.cache; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.FileIDsData; import org.bitrepository.bitrepositoryelements.FileIDsData.FileIDsDataItems; @@ -718,7 +719,11 @@ private List getChecksumResults(String fileID, List res = new ArrayList<>(); ChecksumDataForChecksumSpecTYPE csData = new ChecksumDataForChecksumSpecTYPE(); - csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + try { + csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } csData.setCalculationTimestamp(CalendarUtils.getNow()); csData.setFileID(fileID); res.add(csData); 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 371cef215..b834bbd73 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 @@ -21,6 +21,7 @@ */ package org.bitrepository.integrityservice.cache; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.FileIDsData; import org.bitrepository.bitrepositoryelements.FileIDsData.FileIDsDataItems; @@ -284,7 +285,11 @@ private List getChecksumResults(String fileID, List res = new ArrayList<>(); ChecksumDataForChecksumSpecTYPE csData = new ChecksumDataForChecksumSpecTYPE(); - csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + try { + csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } csData.setCalculationTimestamp(CalendarUtils.getNow()); csData.setFileID(fileID); res.add(csData); 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 eb2b0c896..593b6258c 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 @@ -24,6 +24,7 @@ */ package org.bitrepository.integrityservice.cache; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.FileIDsData; import org.bitrepository.bitrepositoryelements.FileIDsData.FileIDsDataItems; @@ -77,14 +78,14 @@ protected void customizeSettings() { } @Test(groups = {"regressiontest", "databasetest", "integritytest"}) - public void instantiationTest() throws Exception { + public void instantiationTest() { addDescription("Tests that the connection can be instantaited."); IntegrityDatabase integrityCache = new IntegrityDatabase(settings); Assert.assertNotNull(integrityCache); } @Test(groups = {"regressiontest", "databasetest", "integritytest"}) - public void initialStateExtractionTest() throws Exception { + public void initialStateExtractionTest() { addDescription("Tests the initial state of the IntegrityModel. Should not contain any data."); IntegrityModel model = new IntegrityDatabase(settings); @@ -122,7 +123,7 @@ public void initialStateExtractionTest() throws Exception { } @Test(groups = {"regressiontest", "databasetest", "integritytest"}) - public void testIngestOfFileIDsData() throws Exception { + public void testIngestOfFileIDsData() { addDescription("Tests the ingesting of file ids data"); IntegrityModel model = new IntegrityDatabase(settings); @@ -143,7 +144,7 @@ public void testIngestOfFileIDsData() throws Exception { } @Test(groups = {"regressiontest", "databasetest", "integritytest"}) - public void testIngestOfChecksumsData() throws Exception { + public void testIngestOfChecksumsData() { addDescription("Tests the ingesting of checksums data"); IntegrityModel model = new IntegrityDatabase(settings); @@ -163,7 +164,7 @@ public void testIngestOfChecksumsData() throws Exception { } @Test(groups = {"regressiontest", "databasetest", "integritytest"}) - public void testDeletingEntry() throws Exception { + public void testDeletingEntry() { addDescription("Tests the deletion of an FileID entry."); IntegrityModel model = new IntegrityDatabase(settings); @@ -191,7 +192,11 @@ private List getChecksumResults(String fileID, List res = new ArrayList<>(); ChecksumDataForChecksumSpecTYPE csData = new ChecksumDataForChecksumSpecTYPE(); - csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + try { + csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } csData.setCalculationTimestamp(CalendarUtils.getNow()); csData.setFileID(fileID); res.add(csData); @@ -220,7 +225,7 @@ private FileIDsData getFileIDsData(String... fileIDs) { */ private List getIssuesFromIterator(IntegrityIssueIterator it) { List issues = new ArrayList<>(); - String issue = null; + String issue; while((issue = it.getNextIntegrityIssue()) != null) { issues.add(issue); } 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 c4cd51421..5c1446937 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 @@ -21,6 +21,7 @@ */ package org.bitrepository.integrityservice.integrationtest; +import org.apache.commons.codec.DecoderException; import org.bitrepository.access.ContributorQuery; import org.bitrepository.access.getchecksums.conversation.ChecksumsCompletePillarEvent; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; @@ -146,7 +147,7 @@ public void testMissingChecksumForFirstGetChecksums() throws WorkflowAbortedExce populateDatabase(model, TEST_FILE_1); addStep("Add checksum results for only one pillar.", ""); - final ResultingChecksums resultingChecksums = createResultingChecksums(DEFAULT_CHECKSUM, TEST_FILE_1); + final ResultingChecksums resultingChecksums = createResultingChecksums(TEST_FILE_1); doAnswer(invocation -> { EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; eventHandler.handleEvent(new IdentificationCompleteEvent(TEST_COLLECTION, Arrays.asList(PILLAR_1, PILLAR_2))); @@ -192,7 +193,7 @@ public void testMissingChecksumDuringSecondIngest() throws WorkflowAbortedExcept populateDatabase(model, TEST_FILE_1); addStep("Add checksum results for both pillar.", ""); - final ResultingChecksums resultingChecksums = createResultingChecksums(DEFAULT_CHECKSUM, TEST_FILE_1); + final ResultingChecksums resultingChecksums = createResultingChecksums(TEST_FILE_1); doAnswer(invocation -> { EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; eventHandler.handleEvent(new IdentificationCompleteEvent(TEST_COLLECTION, Arrays.asList(PILLAR_1, PILLAR_2))); @@ -278,18 +279,22 @@ protected void populateDatabase(IntegrityModel model, String ... files) { model.addFileIDs(data, PILLAR_2, collectionID); } - private ResultingChecksums createResultingChecksums(String checksum, String ... fileIDs) { + private ResultingChecksums createResultingChecksums(String... fileIDs) { ResultingChecksums res = new ResultingChecksums(); - res.getChecksumDataItems().addAll(createChecksumData(checksum, fileIDs)); + res.getChecksumDataItems().addAll(createChecksumData(fileIDs)); return res; } - private List createChecksumData(String checksum, String ... fileIDs) { + private List createChecksumData(String... fileIDs) { List res = new ArrayList<>(); for(String fileID : fileIDs) { ChecksumDataForChecksumSpecTYPE csData = new ChecksumDataForChecksumSpecTYPE(); csData.setCalculationTimestamp(CalendarUtils.getNow()); - csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + try { + csData.setChecksumValue(Base16Utils.encodeBase16(MissingChecksumTests.DEFAULT_CHECKSUM)); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } csData.setFileID(fileID); res.add(csData); } 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 3c83a4687..c41453cbc 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 @@ -5,22 +5,23 @@ * 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 + * 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.integrityservice.workflow; +import org.apache.commons.codec.DecoderException; import org.bitrepository.access.getchecksums.conversation.ChecksumsCompletePillarEvent; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; @@ -42,7 +43,6 @@ import org.bitrepository.service.audit.AuditTrailManager; import org.bitrepository.service.workflow.Workflow; import org.jaccept.structure.ExtendedTestCase; -import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -61,11 +61,11 @@ import static org.mockito.Mockito.when; public class SaltedChecksumWorkflowTest extends ExtendedTestCase { - + private static final String PILLAR_1 = "pillar1"; private static final String PILLAR_2 = "pillar2"; private static final String PILLAR_3 = "pillar3"; - + private static final String TEST_FILE_1 = "test-file-1"; private String TEST_COLLECTION; @@ -74,7 +74,7 @@ public class SaltedChecksumWorkflowTest extends ExtendedTestCase { protected IntegrityAlerter alerter; protected IntegrityModel model; protected AuditTrailManager auditManager; - + @BeforeMethod(alwaysRun = true) public void setup() throws Exception { settings = TestSettingsProvider.reloadSettings("IntegrityWorkflowTest"); @@ -83,10 +83,10 @@ public void setup() throws Exception { 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().get(0).getPillarIDs().getPillarID().add(PILLAR_3); - + TEST_COLLECTION = settings.getRepositorySettings().getCollections().getCollection().get(0).getID(); SettingsUtils.initialize(settings); - + collector = mock(IntegrityInformationCollector.class); alerter = mock(IntegrityAlerter.class); model = mock(IntegrityModel.class); @@ -94,7 +94,7 @@ public void setup() throws Exception { } @Test(groups = {"regressiontest", "integritytest"}) - public void testNoFilesInCollection() throws Exception { + public void testNoFilesInCollection() { addDescription("Test that the workflow does nothing, when it has no files in the collection."); addStep("Prepare for calls to mocks", ""); when(model.getNumberOfFilesInCollection(anyString())).thenReturn(Long.valueOf(0)); @@ -105,94 +105,96 @@ public void testNoFilesInCollection() throws Exception { IntegrityWorkflowContext context = new IntegrityWorkflowContext(settings, collector, model, alerter, auditManager); workflow.initialise(context, TEST_COLLECTION); workflow.start(); - + verify(alerter).integrityFailed(anyString(), eq(TEST_COLLECTION)); verifyNoMoreInteractions(alerter); - + verifyNoInteractions(collector); verifyNoInteractions(auditManager); - + verify(model).getNumberOfFilesInCollection(eq(TEST_COLLECTION)); verifyNoMoreInteractions(model); } - + @Test(groups = {"regressiontest", "integritytest"}) - public void testSuccess() throws Exception { + public void testSuccess() { addDescription("Test that the workflow works when both pillars deliver the same checksum."); addStep("Prepare for calls to mocks", ""); when(model.getNumberOfFilesInCollection(anyString())).thenReturn(Long.valueOf(1)); when(model.getFileIDAtPosition(eq(TEST_COLLECTION), eq(0L))).thenReturn(TEST_FILE_1); - - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - ResultingChecksums res = createResultingChecksums((String) invocation.getArguments()[3], "abcdef"); - eventHandler.handleEvent(new ChecksumsCompletePillarEvent(PILLAR_1, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], false)); - eventHandler.handleEvent(new ChecksumsCompletePillarEvent(PILLAR_2, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], false)); - eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); - return null; - } + + doAnswer((Answer) invocation -> { + EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; + ResultingChecksums res = createResultingChecksums((String) invocation.getArguments()[3], "abcdef"); + eventHandler.handleEvent( + new ChecksumsCompletePillarEvent(PILLAR_1, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], + false)); + eventHandler.handleEvent( + new ChecksumsCompletePillarEvent(PILLAR_2, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], + false)); + eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); + return null; }).when(collector).getChecksums(anyString(), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); - + addStep("Run workflow for checking salted checksum.", "Should send alarm about failure"); Workflow workflow = new SaltedChecksumWorkflow(); IntegrityWorkflowContext context = new IntegrityWorkflowContext(settings, collector, model, alerter, auditManager); workflow.initialise(context, TEST_COLLECTION); workflow.start(); - + verifyNoInteractions(alerter); - + verify(collector).getChecksums(eq(TEST_COLLECTION), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); verifyNoMoreInteractions(collector); - + verify(model).getNumberOfFilesInCollection(eq(TEST_COLLECTION)); verify(model).getFileIDAtPosition(eq(TEST_COLLECTION), eq(0L)); verifyNoMoreInteractions(model); - + verify(auditManager).addAuditEvent(eq(TEST_COLLECTION), anyString(), anyString(), anyString(), anyString(), any(), any(), any()); verifyNoMoreInteractions(auditManager); } @Test(groups = {"regressiontest", "integritytest"}) - public void testOneComponentFailureAndTwoOtherAgreeOnChecksum() throws Exception { + public void testOneComponentFailureAndTwoOtherAgreeOnChecksum() { addDescription("Test that the workflow works when both pillars deliver the same checksum."); addStep("Prepare for calls to mocks", ""); when(model.getNumberOfFilesInCollection(anyString())).thenReturn(Long.valueOf(1)); when(model.getFileIDAtPosition(eq(TEST_COLLECTION), eq(0L))).thenReturn(TEST_FILE_1); - - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - ResultingChecksums res = createResultingChecksums((String) invocation.getArguments()[3], "abcdef"); - ContributorEvent e1 = new ChecksumsCompletePillarEvent(PILLAR_1, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], false); - ContributorEvent e2 = new ChecksumsCompletePillarEvent(PILLAR_2, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], false); - ContributorEvent e3 = new ContributorFailedEvent(PILLAR_3, TEST_COLLECTION, ResponseCode.FAILURE); - eventHandler.handleEvent(e1); - eventHandler.handleEvent(e2); - eventHandler.handleEvent(e3); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "COMPONENT FAILED", Arrays.asList(e1, e2, e3))); - return null; - } + + doAnswer((Answer) invocation -> { + EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; + ResultingChecksums res = createResultingChecksums((String) invocation.getArguments()[3], "abcdef"); + ContributorEvent e1 = new ChecksumsCompletePillarEvent(PILLAR_1, TEST_COLLECTION, res, + (ChecksumSpecTYPE) invocation.getArguments()[2], false); + ContributorEvent e2 = new ChecksumsCompletePillarEvent(PILLAR_2, TEST_COLLECTION, res, + (ChecksumSpecTYPE) invocation.getArguments()[2], false); + ContributorEvent e3 = new ContributorFailedEvent(PILLAR_3, TEST_COLLECTION, ResponseCode.FAILURE); + eventHandler.handleEvent(e1); + eventHandler.handleEvent(e2); + eventHandler.handleEvent(e3); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "COMPONENT FAILED", Arrays.asList(e1, e2, e3))); + return null; }).when(collector).getChecksums(anyString(), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); - + addStep("Run workflow for checking salted checksum.", "Should send alarm about failure"); Workflow workflow = new SaltedChecksumWorkflow(); IntegrityWorkflowContext context = new IntegrityWorkflowContext(settings, collector, model, alerter, auditManager); workflow.initialise(context, TEST_COLLECTION); workflow.start(); - + verify(alerter).integrityFailed(anyString(), eq(TEST_COLLECTION)); verifyNoMoreInteractions(alerter); - + verify(collector).getChecksums(eq(TEST_COLLECTION), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); verifyNoMoreInteractions(collector); - + verify(model).getNumberOfFilesInCollection(eq(TEST_COLLECTION)); verify(model).getFileIDAtPosition(eq(TEST_COLLECTION), eq(0L)); verifyNoMoreInteractions(model); - + verify(auditManager).addAuditEvent(eq(TEST_COLLECTION), anyString(), anyString(), anyString(), anyString(), any(), any(), any()); verifyNoMoreInteractions(auditManager); } @@ -203,127 +205,132 @@ public void testOneComponentFailureAndTwoOtherDisagreeOnChecksum() throws Except addStep("Prepare for calls to mocks", ""); when(model.getNumberOfFilesInCollection(anyString())).thenReturn(Long.valueOf(1)); when(model.getFileIDAtPosition(eq(TEST_COLLECTION), eq(0L))).thenReturn(TEST_FILE_1); - - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - ResultingChecksums res1 = createResultingChecksums((String) invocation.getArguments()[3], "abcdef"); - ResultingChecksums res2 = createResultingChecksums((String) invocation.getArguments()[3], "fedcba"); - ContributorEvent e1 = new ChecksumsCompletePillarEvent(PILLAR_1, TEST_COLLECTION, res1, (ChecksumSpecTYPE) invocation.getArguments()[2], false); - ContributorEvent e2 = new ChecksumsCompletePillarEvent(PILLAR_2, TEST_COLLECTION, res2, (ChecksumSpecTYPE) invocation.getArguments()[2], false); - ContributorEvent e3 = new ContributorFailedEvent(PILLAR_3, TEST_COLLECTION, ResponseCode.FAILURE); - eventHandler.handleEvent(e1); - eventHandler.handleEvent(e2); - eventHandler.handleEvent(e3); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "COMPONENT FAILED", Arrays.asList(e1, e2, e3))); - return null; - } + + doAnswer((Answer) invocation -> { + EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; + ResultingChecksums res1 = createResultingChecksums((String) invocation.getArguments()[3], "abcdef"); + ResultingChecksums res2 = createResultingChecksums((String) invocation.getArguments()[3], "fedcba"); + ContributorEvent e1 = new ChecksumsCompletePillarEvent(PILLAR_1, TEST_COLLECTION, res1, + (ChecksumSpecTYPE) invocation.getArguments()[2], false); + ContributorEvent e2 = new ChecksumsCompletePillarEvent(PILLAR_2, TEST_COLLECTION, res2, + (ChecksumSpecTYPE) invocation.getArguments()[2], false); + ContributorEvent e3 = new ContributorFailedEvent(PILLAR_3, TEST_COLLECTION, ResponseCode.FAILURE); + eventHandler.handleEvent(e1); + eventHandler.handleEvent(e2); + eventHandler.handleEvent(e3); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "COMPONENT FAILED", Arrays.asList(e1, e2, e3))); + return null; }).when(collector).getChecksums(anyString(), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); - + addStep("Run workflow for checking salted checksum.", "Should send alarm about failure"); Workflow workflow = new SaltedChecksumWorkflow(); IntegrityWorkflowContext context = new IntegrityWorkflowContext(settings, collector, model, alerter, auditManager); workflow.initialise(context, TEST_COLLECTION); workflow.start(); - + verify(alerter, times(2)).integrityFailed(anyString(), eq(TEST_COLLECTION)); verifyNoMoreInteractions(alerter); - + verify(collector).getChecksums(eq(TEST_COLLECTION), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); verifyNoMoreInteractions(collector); - + verify(model).getNumberOfFilesInCollection(eq(TEST_COLLECTION)); verify(model).getFileIDAtPosition(eq(TEST_COLLECTION), eq(0L)); verifyNoMoreInteractions(model); - + verify(auditManager).addAuditEvent(eq(TEST_COLLECTION), anyString(), anyString(), anyString(), anyString(), any(), any(), any()); verifyNoMoreInteractions(auditManager); } @Test(groups = {"regressiontest", "integritytest"}) - public void testInconsistentChecksums() throws Exception { + public void testInconsistentChecksums() { addDescription("Test that the workflow discovers and handles inconsistent checksums"); addStep("Prepare for calls to mocks", ""); when(model.getNumberOfFilesInCollection(anyString())).thenReturn(Long.valueOf(1)); when(model.getFileIDAtPosition(eq(TEST_COLLECTION), eq(0L))).thenReturn(TEST_FILE_1); - - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - ResultingChecksums res1 = createResultingChecksums((String) invocation.getArguments()[3], "abcdef"); - ResultingChecksums res2 = createResultingChecksums((String) invocation.getArguments()[3], "fedcba"); - eventHandler.handleEvent(new ChecksumsCompletePillarEvent(PILLAR_1, TEST_COLLECTION, res1, (ChecksumSpecTYPE) invocation.getArguments()[2], false)); - eventHandler.handleEvent(new ChecksumsCompletePillarEvent(PILLAR_2, TEST_COLLECTION, res2, (ChecksumSpecTYPE) invocation.getArguments()[2], false)); - eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); - return null; - } + + doAnswer((Answer) invocation -> { + EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; + ResultingChecksums res1 = createResultingChecksums((String) invocation.getArguments()[3], "abcdef"); + ResultingChecksums res2 = createResultingChecksums((String) invocation.getArguments()[3], "fedcba"); + eventHandler.handleEvent( + new ChecksumsCompletePillarEvent(PILLAR_1, TEST_COLLECTION, res1, (ChecksumSpecTYPE) invocation.getArguments()[2], + false)); + eventHandler.handleEvent( + new ChecksumsCompletePillarEvent(PILLAR_2, TEST_COLLECTION, res2, (ChecksumSpecTYPE) invocation.getArguments()[2], + false)); + eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); + return null; }).when(collector).getChecksums(anyString(), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); - + addStep("Run workflow for checking salted checksum.", "Should send alarm about failure"); Workflow workflow = new SaltedChecksumWorkflow(); IntegrityWorkflowContext context = new IntegrityWorkflowContext(settings, collector, model, alerter, auditManager); workflow.initialise(context, TEST_COLLECTION); workflow.start(); - + verify(collector).getChecksums(eq(TEST_COLLECTION), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); verifyNoMoreInteractions(collector); - + verify(model).getNumberOfFilesInCollection(eq(TEST_COLLECTION)); verify(model).getFileIDAtPosition(eq(TEST_COLLECTION), eq(0L)); verifyNoMoreInteractions(model); - - verify(auditManager).addAuditEvent(eq(TEST_COLLECTION), anyString(), anyString(), anyString(), + + verify(auditManager).addAuditEvent(eq(TEST_COLLECTION), anyString(), anyString(), anyString(), anyString(), any(), any(), any()); verifyNoMoreInteractions(auditManager); - + verify(alerter).integrityFailed(anyString(), eq(TEST_COLLECTION)); verifyNoMoreInteractions(alerter); } @Test(groups = {"regressiontest", "integritytest"}) - public void testNoReceivedChecksums() throws Exception { + public void testNoReceivedChecksums() { addDescription("Test that the workflow handles the case, when no checksums are received"); addStep("Prepare for calls to mocks", ""); when(model.getNumberOfFilesInCollection(anyString())).thenReturn(Long.valueOf(1)); when(model.getFileIDAtPosition(eq(TEST_COLLECTION), eq(0L))).thenReturn(TEST_FILE_1); - - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "", null)); - return null; - } + + doAnswer((Answer) invocation -> { + EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "", null)); + return null; }).when(collector).getChecksums(anyString(), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); - + addStep("Run workflow for checking salted checksum.", "Should send alarm about failure"); Workflow workflow = new SaltedChecksumWorkflow(); IntegrityWorkflowContext context = new IntegrityWorkflowContext(settings, collector, model, alerter, auditManager); workflow.initialise(context, TEST_COLLECTION); workflow.start(); - + verify(collector).getChecksums(eq(TEST_COLLECTION), any(), any(), anyString(), anyString(), any(), any(EventHandler.class)); verifyNoMoreInteractions(collector); - + verify(model).getNumberOfFilesInCollection(eq(TEST_COLLECTION)); verify(model).getFileIDAtPosition(eq(TEST_COLLECTION), eq(0L)); verifyNoMoreInteractions(model); - - verify(auditManager).addAuditEvent(eq(TEST_COLLECTION), anyString(), anyString(), anyString(), + + verify(auditManager).addAuditEvent(eq(TEST_COLLECTION), anyString(), anyString(), anyString(), anyString(), any(), any(), any()); verifyNoMoreInteractions(auditManager); - + verify(alerter).integrityFailed(anyString(), eq(TEST_COLLECTION)); verifyNoMoreInteractions(alerter); } - + private ResultingChecksums createResultingChecksums(String fileId, String checksum) { ChecksumDataForChecksumSpecTYPE csData = new ChecksumDataForChecksumSpecTYPE(); csData.setCalculationTimestamp(CalendarUtils.getNow()); csData.setFileID(fileId); - csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + try { + csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } + ResultingChecksums res = new ResultingChecksums(); res.getChecksumDataItems().add(csData); return res; 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 7702129ea..05b93027e 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 @@ -5,22 +5,23 @@ * 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.integrityservice.workflow.step; +import org.apache.commons.codec.DecoderException; import org.bitrepository.access.getchecksums.conversation.ChecksumsCompletePillarEvent; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; @@ -35,7 +36,6 @@ import org.bitrepository.common.utils.CalendarUtils; import org.bitrepository.common.utils.ChecksumUtils; import org.bitrepository.integrityservice.workflow.IntegrityContributors; -import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.testng.Assert; import org.testng.annotations.BeforeMethod; @@ -55,15 +55,17 @@ * Performs the validation of the integrity for the checksums. */ public class GetChecksumForFileStepTest extends WorkflowstepTest { - /** The settings for the tests. Should be instantiated in the setup.*/ + /** + * The settings for the tests. Should be instantiated in the setup. + */ public static final String TEST_PILLAR_1 = "test-pillar-1"; public static final String TEST_PILLAR_2 = "test-pillar-2"; public static final String TEST_PILLAR_3 = "test-pillar-3"; - + public static final String FILE_1 = "test-file-1"; public static final String FILE_2 = "test-file-2"; String TEST_COLLECTION = "test-collection"; - + @BeforeMethod(alwaysRun = true) public void setup() { super.setup(); @@ -74,25 +76,24 @@ public void setup() { integrityContributors = new IntegrityContributors(Arrays.asList(TEST_PILLAR_1, TEST_PILLAR_2, TEST_PILLAR_3), 0); } - + @Test(groups = {"regressiontest", "integritytest"}) public void testNoResults() throws Exception { addDescription("Test step for retrieving the checksum of a single file, when no results are delivered."); ChecksumSpecTYPE checksumType = ChecksumUtils.getDefault(settings); - + addStep("Setup mock answers", ""); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); - return null; - } + doAnswer((Answer) invocation -> { + EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; + eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); + return null; }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), anyString(), anyString(), any(), any(EventHandler.class)); - GetChecksumForFileStep step = new GetChecksumForFileStep(collector, alerter, checksumType, FILE_1, settings, TEST_COLLECTION, integrityContributors); - + GetChecksumForFileStep step = new GetChecksumForFileStep(collector, alerter, checksumType, FILE_1, settings, TEST_COLLECTION, + integrityContributors); + addStep("Validate the checksum results", "Should not have any results"); step.performStep(); @@ -101,30 +102,35 @@ public Void answer(InvocationOnMock invocation) { verify(collector).getChecksums(anyString(), any(), eq(checksumType), eq(FILE_1), anyString(), any(), any(EventHandler.class)); verifyNoMoreInteractions(collector); } - + @Test(groups = {"regressiontest", "integritytest"}) public void testFullData() throws Exception { addDescription("Test step for retrieving the checksum of a single file, when all three pillars deliver results."); ChecksumSpecTYPE checksumType = ChecksumUtils.getDefault(settings); - + addStep("Setup mock answers", ""); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - - ResultingChecksums res = createResultingChecksums((String) invocation.getArguments()[3], "abcdef"); - eventHandler.handleEvent(new ChecksumsCompletePillarEvent(TEST_PILLAR_1, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], false)); - eventHandler.handleEvent(new ChecksumsCompletePillarEvent(TEST_PILLAR_2, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], false)); - eventHandler.handleEvent(new ChecksumsCompletePillarEvent(TEST_PILLAR_3, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], false)); - eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); - return null; - } + doAnswer((Answer) invocation -> { + EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; + + ResultingChecksums res = createResultingChecksums((String) invocation.getArguments()[3]); + eventHandler.handleEvent( + new ChecksumsCompletePillarEvent(TEST_PILLAR_1, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], + false)); + eventHandler.handleEvent( + new ChecksumsCompletePillarEvent(TEST_PILLAR_2, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], + false)); + eventHandler.handleEvent( + new ChecksumsCompletePillarEvent(TEST_PILLAR_3, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], + false)); + eventHandler.handleEvent(new CompleteEvent(TEST_COLLECTION, null)); + return null; }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), anyString(), anyString(), any(), any(EventHandler.class)); - GetChecksumForFileStep step = new GetChecksumForFileStep(collector, alerter, checksumType, FILE_1, settings, TEST_COLLECTION, integrityContributors); - + GetChecksumForFileStep step = new GetChecksumForFileStep(collector, alerter, checksumType, FILE_1, settings, TEST_COLLECTION, + integrityContributors); + addStep("Validate the checksum results", "Should have checksum for each pillar."); step.performStep(); @@ -133,7 +139,7 @@ public Void answer(InvocationOnMock invocation) { Assert.assertTrue(step.getResults().containsKey(TEST_PILLAR_1)); Assert.assertTrue(step.getResults().containsKey(TEST_PILLAR_2)); Assert.assertTrue(step.getResults().containsKey(TEST_PILLAR_3)); - + verifyNoInteractions(alerter); verify(collector).getChecksums(anyString(), any(), eq(checksumType), eq(FILE_1), anyString(), any(), any(EventHandler.class)); verifyNoMoreInteractions(collector); @@ -143,28 +149,29 @@ public Void answer(InvocationOnMock invocation) { public void testComponentFailure() throws Exception { addDescription("Test step for retrieving the checksum of a single file, when one pillar fails."); ChecksumSpecTYPE checksumType = ChecksumUtils.getDefault(settings); - + addStep("Setup mock answers", ""); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) { - EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - - ResultingChecksums res = createResultingChecksums((String) invocation.getArguments()[3], "abcdef"); - ContributorEvent e1 = new ChecksumsCompletePillarEvent(TEST_PILLAR_1, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], false); - ContributorEvent e2 = new ChecksumsCompletePillarEvent(TEST_PILLAR_2, TEST_COLLECTION, res, (ChecksumSpecTYPE) invocation.getArguments()[2], false); - ContributorEvent e3 = new ContributorFailedEvent(TEST_PILLAR_3, TEST_COLLECTION, ResponseCode.REQUEST_NOT_UNDERSTOOD_FAILURE); - eventHandler.handleEvent(e1); - eventHandler.handleEvent(e2); - eventHandler.handleEvent(e3); - eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "COMPONENT FAILED", Arrays.asList(e1, e2, e3))); - return null; - } + doAnswer((Answer) invocation -> { + EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; + + ResultingChecksums res = createResultingChecksums((String) invocation.getArguments()[3]); + ContributorEvent e1 = new ChecksumsCompletePillarEvent(TEST_PILLAR_1, TEST_COLLECTION, res, + (ChecksumSpecTYPE) invocation.getArguments()[2], false); + ContributorEvent e2 = new ChecksumsCompletePillarEvent(TEST_PILLAR_2, TEST_COLLECTION, res, + (ChecksumSpecTYPE) invocation.getArguments()[2], false); + ContributorEvent e3 = new ContributorFailedEvent(TEST_PILLAR_3, TEST_COLLECTION, ResponseCode.REQUEST_NOT_UNDERSTOOD_FAILURE); + eventHandler.handleEvent(e1); + eventHandler.handleEvent(e2); + eventHandler.handleEvent(e3); + eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "COMPONENT FAILED", Arrays.asList(e1, e2, e3))); + return null; }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), anyString(), anyString(), any(), any(EventHandler.class)); - GetChecksumForFileStep step = new GetChecksumForFileStep(collector, alerter, checksumType, FILE_1, settings, TEST_COLLECTION, integrityContributors); - + GetChecksumForFileStep step = new GetChecksumForFileStep(collector, alerter, checksumType, FILE_1, settings, TEST_COLLECTION, + integrityContributors); + addStep("Validate the file ids", "Should not have integrity issues."); step.performStep(); @@ -173,18 +180,22 @@ public Void answer(InvocationOnMock invocation) { Assert.assertTrue(step.getResults().containsKey(TEST_PILLAR_1)); Assert.assertTrue(step.getResults().containsKey(TEST_PILLAR_2)); Assert.assertFalse(step.getResults().containsKey(TEST_PILLAR_3)); - + verify(alerter).integrityFailed(anyString(), eq(TEST_COLLECTION)); verifyNoMoreInteractions(alerter); verify(collector).getChecksums(anyString(), any(), eq(checksumType), eq(FILE_1), anyString(), any(), any(EventHandler.class)); verifyNoMoreInteractions(collector); } - - private ResultingChecksums createResultingChecksums(String fileId, String checksum) { + + private ResultingChecksums createResultingChecksums(String fileId) { ChecksumDataForChecksumSpecTYPE csData = new ChecksumDataForChecksumSpecTYPE(); csData.setCalculationTimestamp(CalendarUtils.getNow()); csData.setFileID(fileId); - csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + try { + csData.setChecksumValue(Base16Utils.encodeBase16("abcdef")); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } ResultingChecksums res = new ResultingChecksums(); res.getChecksumDataItems().add(csData); return res; diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/HandleChecksumValidationStepTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/HandleChecksumValidationStepTest.java index 83891a277..161b8dd03 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/HandleChecksumValidationStepTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/workflow/step/HandleChecksumValidationStepTest.java @@ -21,11 +21,9 @@ */ package org.bitrepository.integrityservice.workflow.step; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.FileAction; -import org.bitrepository.bitrepositoryelements.FileIDsData; -import org.bitrepository.bitrepositoryelements.FileIDsData.FileIDsDataItems; -import org.bitrepository.bitrepositoryelements.FileIDsDataItem; import org.bitrepository.common.utils.Base16Utils; import org.bitrepository.common.utils.CalendarUtils; import org.bitrepository.common.utils.SettingsUtils; @@ -42,7 +40,6 @@ import org.testng.annotations.Test; import java.io.File; -import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -214,10 +211,10 @@ public void testChecksumMajority() throws Exception { addStep("Validate the file ids", "Should only have integrity issues on pillar 3."); Assert.assertTrue(reporter.hasIntegrityIssues(), reporter.generateSummaryOfReport()); - Assert.assertTrue(cs.getCollectionStat().getChecksumErrors() == 1); - Assert.assertTrue(cs.getPillarCollectionStat(TEST_PILLAR_3).getChecksumErrors() == 1); - Assert.assertTrue(cs.getPillarCollectionStat(TEST_PILLAR_2).getChecksumErrors() == 0); - Assert.assertTrue(cs.getPillarCollectionStat(TEST_PILLAR_1).getChecksumErrors() == 0); + Assert.assertEquals((long) cs.getCollectionStat().getChecksumErrors(), 1); + Assert.assertEquals((long) cs.getPillarCollectionStat(TEST_PILLAR_3).getChecksumErrors(), 1); + Assert.assertEquals((long) cs.getPillarCollectionStat(TEST_PILLAR_2).getChecksumErrors(), 0); + Assert.assertEquals((long) cs.getPillarCollectionStat(TEST_PILLAR_1).getChecksumErrors(), 0); } @Test(groups = {"regressiontest", "integritytest"}) @@ -245,7 +242,7 @@ public void testAuditTrailsForChecksumErrors() throws Exception { List fis = (List) cache.getFileInfos(FILE_1, TEST_COLLECTION); System.out.println("number of files in the collection" + cache.getNumberOfFilesInCollection(TEST_COLLECTION)); - System.out.println("number of fileinfos: " + fis.size()); + System.out.println("number of file infos: " + fis.size()); Assert.assertNotNull(fis.get(0).getChecksum()); step.performStep(); @@ -256,7 +253,7 @@ public void testAuditTrailsForChecksumErrors() throws Exception { Assert.assertTrue(auditManager.latestAuditInfo.contains(FILE_2), auditManager.latestAuditInfo); Assert.assertTrue(auditManager.latestAuditInfo.contains(TEST_COLLECTION), auditManager.latestAuditInfo); - addStep("remove the last auditinfo", ""); + addStep("remove the last audit info", ""); auditManager.latestAuditInfo = null; addStep("Test step on data where two pillars have one checksum and the last pillar has a different one", @@ -272,27 +269,17 @@ public void testAuditTrailsForChecksumErrors() throws Exception { Assert.assertTrue(auditManager.latestAuditInfo.contains(FILE_2), auditManager.latestAuditInfo); Assert.assertTrue(auditManager.latestAuditInfo.contains(TEST_COLLECTION), auditManager.latestAuditInfo); } - - private FileIDsData createFileIdData(String ... fileids) { - FileIDsData res = new FileIDsData(); - FileIDsDataItems items = new FileIDsDataItems(); - for(String fileid : fileids) { - FileIDsDataItem item = new FileIDsDataItem(); - item.setFileID(fileid); - item.setFileSize(BigInteger.ONE); - item.setLastModificationTime(CalendarUtils.getNow()); - items.getFileIDsDataItem().add(item); - } - res.setFileIDsDataItems(items); - return res; - } - + private List createChecksumData(String checksum, String ... fileids) { List res = new ArrayList<>(); for(String fileID : fileids) { ChecksumDataForChecksumSpecTYPE csData = new ChecksumDataForChecksumSpecTYPE(); csData.setCalculationTimestamp(CalendarUtils.getNow()); - csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + try { + csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } csData.setFileID(fileID); res.add(csData); } @@ -303,7 +290,7 @@ private IntegrityModel getIntegrityModel() { return new IntegrityDatabase(settings); } - private class TestAuditTrailManager implements AuditTrailManager { + private static class TestAuditTrailManager implements AuditTrailManager { String latestAuditInfo; @Override 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 8e4207f23..8146ddf86 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 @@ -5,22 +5,23 @@ * 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.integrityservice.workflow.step; +import org.apache.commons.codec.DecoderException; import org.bitrepository.access.ContributorQuery; import org.bitrepository.access.getchecksums.conversation.ChecksumsCompletePillarEvent; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; @@ -78,9 +79,9 @@ public Void answer(InvocationOnMock invocation) { anyString(), any(ContributorQuery[].class), any(EventHandler.class)); when(integrityContributors.getActiveContributors()) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); - - UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); + + UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), settings, TEST_COLLECTION, integrityContributors); step.performStep(); verify(collector).getChecksums(eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), @@ -104,12 +105,12 @@ public Void answer(InvocationOnMock invocation) { anyString(), any(ContributorQuery[].class), any(EventHandler.class)); when(integrityContributors.getActiveContributors()) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) - .thenReturn(new HashSet<>()); + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) + .thenReturn(new HashSet<>()); when(integrityContributors.getFailedContributors()).thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))); - + settings.getReferenceSettings().getIntegrityServiceSettings().setAbortOnFailedContributor(true); - UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), + UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), settings, TEST_COLLECTION, integrityContributors); try { step.performStep(); @@ -122,17 +123,18 @@ public Void answer(InvocationOnMock invocation) { verify(integrityContributors).failContributor(eq(TEST_PILLAR_1)); verify(alerter).integrityFailed(anyString(), eq(TEST_COLLECTION)); } - + @Test(groups = {"regressiontest"}) public void testRetryCollectionWhenNegativeReply() throws WorkflowAbortedException { addDescription("Test the step for updating the file ids will retry on a FAILED event"); - + final ResultingChecksums resultingChecksums = createResultingChecksums(DEFAULT_CHECKSUM, TEST_FILE_1); doAnswer(new Answer() { boolean firstAnswer = true; + public Void answer(InvocationOnMock invocation) { EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; - if(firstAnswer) { + if (firstAnswer) { firstAnswer = false; eventHandler.handleEvent(new ContributorFailedEvent(TEST_PILLAR_1, TEST_COLLECTION, ResponseCode.FAILURE)); eventHandler.handleEvent(new OperationFailedEvent(TEST_COLLECTION, "Problem encountered", null)); @@ -149,12 +151,12 @@ public Void answer(InvocationOnMock invocation) { anyString(), any(ContributorQuery[].class), any(EventHandler.class)); when(integrityContributors.getActiveContributors()) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) - .thenReturn(new HashSet<>()); + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) + .thenReturn(new HashSet<>()); when(integrityContributors.getFailedContributors()).thenReturn(new HashSet<>()); - UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), + UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), settings, TEST_COLLECTION, integrityContributors); step.performStep(); verify(collector, times(2)).getChecksums(eq(TEST_COLLECTION), any(), @@ -163,9 +165,9 @@ public Void answer(InvocationOnMock invocation) { verifyNoMoreInteractions(alerter); verify(integrityContributors).failContributor(eq(TEST_PILLAR_1)); verify(integrityContributors).finishContributor(eq(TEST_PILLAR_1)); - + } - + @Test(groups = {"regressiontest"}) public void testContinueWorkflowNegativeReply() throws WorkflowAbortedException { addDescription("Test the step for updating the checksums will continue the workflow in case " @@ -182,21 +184,21 @@ public Void answer(InvocationOnMock invocation) { anyString(), any(ContributorQuery[].class), any(EventHandler.class)); when(integrityContributors.getActiveContributors()) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) - .thenReturn(new HashSet<>()); + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) + .thenReturn(new HashSet<>()); when(integrityContributors.getFailedContributors()).thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))); - + settings.getReferenceSettings().getIntegrityServiceSettings().setAbortOnFailedContributor(false); - UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), + UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), settings, TEST_COLLECTION, integrityContributors); step.performStep(); - + verify(integrityContributors).failContributor(eq(TEST_PILLAR_1)); verify(collector).getChecksums(eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), any(), anyString(), any(ContributorQuery[].class), any(EventHandler.class)); verify(alerter).integrityFailed(anyString(), eq(TEST_COLLECTION)); } - + @Test(groups = {"regressiontest"}) public void testIngestOfResults() throws WorkflowAbortedException { addDescription("Test the step for updating the checksums delivers the results to the integrity model."); @@ -215,11 +217,11 @@ public Void answer(InvocationOnMock invocation) { anyString(), any(ContributorQuery[].class), any(EventHandler.class)); when(integrityContributors.getActiveContributors()) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); when(integrityContributors.getActiveContributors()) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); - - UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); + + UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), settings, TEST_COLLECTION, integrityContributors); step.performStep(); verify(collector).getChecksums(eq(TEST_COLLECTION), any(), @@ -246,9 +248,9 @@ public Void answer(InvocationOnMock invocation) { anyString(), any(ContributorQuery[].class), any(EventHandler.class)); when(integrityContributors.getActiveContributors()) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); - - UpdateChecksumsStep step = new FullUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); + + UpdateChecksumsStep step = new FullUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), settings, TEST_COLLECTION, integrityContributors); step.performStep(); verify(collector).getChecksums(eq(TEST_COLLECTION), any(), @@ -257,17 +259,18 @@ public Void answer(InvocationOnMock invocation) { verify(model).addChecksums(resultingChecksums.getChecksumDataItems(), TEST_PILLAR_1, TEST_COLLECTION); verifyNoMoreInteractions(alerter); } - + @Test(groups = {"regressiontest"}) public void testPartialResults() throws WorkflowAbortedException { addDescription("Test that the number of partial is used for generating more than one request."); final ResultingChecksums resultingChecksums = createResultingChecksums(DEFAULT_CHECKSUM, TEST_FILE_1); addStep("Setup the collector mock to generate a isPartialResult=true event the first time and a " + - "isPartialResult=false the second time", + "isPartialResult=false the second time", "The collectors getFileIDs should be called 2 time. The same goes for the 'models' addFileIDs"); doAnswer(new Answer() { boolean firstPage = true; + public Void answer(InvocationOnMock invocation) { EventHandler eventHandler = (EventHandler) invocation.getArguments()[6]; eventHandler.handleEvent(new IdentificationCompleteEvent(TEST_COLLECTION, Arrays.asList(TEST_PILLAR_1))); @@ -282,11 +285,11 @@ public Void answer(InvocationOnMock invocation) { anyString(), any(ContributorQuery[].class), any(EventHandler.class)); when(integrityContributors.getActiveContributors()) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) - .thenReturn(new HashSet<>()); - - UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))) + .thenReturn(new HashSet<>()); + + UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), settings, TEST_COLLECTION, integrityContributors); step.performStep(); @@ -294,11 +297,11 @@ public Void answer(InvocationOnMock invocation) { verify(collector, times(2)).getChecksums(eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), any(), anyString(), any(ContributorQuery[].class), any(EventHandler.class)); } - + @Test(groups = {"regressiontest"}) public 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]; @@ -311,24 +314,25 @@ public Void answer(InvocationOnMock invocation) { when(model.getDateForNewestChecksumEntryForPillar(anyString(), anyString())).thenReturn(new Date(0)); when(integrityContributors.getActiveContributors()) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); - - UpdateChecksumsStep step = new FullUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); + + UpdateChecksumsStep step = new FullUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), settings, TEST_COLLECTION, integrityContributors); step.performStep(); - - ContributorQuery[] expectedContributorQueries = - makeFullQueries(settings.getRepositorySettings().getCollections().getCollection().get(0).getPillarIDs().getPillarID(), model); - + + ContributorQuery[] expectedContributorQueries = + makeFullQueries(settings.getRepositorySettings().getCollections().getCollection().get(0).getPillarIDs().getPillarID(), + model); + verify(collector).getChecksums(eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), - any(), anyString(), eq(expectedContributorQueries), any(EventHandler.class)); + any(), anyString(), eq(expectedContributorQueries), any(EventHandler.class)); verifyNoMoreInteractions(alerter); } - + @Test(groups = {"regressiontest"}) public 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]; @@ -338,55 +342,59 @@ public Void answer(InvocationOnMock invocation) { }).when(collector).getChecksums( eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), any(), anyString(), any(ContributorQuery[].class), any(EventHandler.class)); - + when(integrityContributors.getActiveContributors()) - .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); - - UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), + .thenReturn(new HashSet<>(Arrays.asList(TEST_PILLAR_1))).thenReturn(new HashSet<>()); + + UpdateChecksumsStep step = new IncrementalUpdateChecksumsStep(collector, model, alerter, createChecksumSpecTYPE(), settings, TEST_COLLECTION, integrityContributors); step.performStep(); - - ContributorQuery[] expectedContributorQueries = - makeQueries(settings.getRepositorySettings().getCollections().getCollection().get(0).getPillarIDs().getPillarID(), model); - + + ContributorQuery[] expectedContributorQueries = + makeQueries(settings.getRepositorySettings().getCollections().getCollection().get(0).getPillarIDs().getPillarID(), model); + verify(collector).getChecksums(eq(TEST_COLLECTION), any(), any(ChecksumSpecTYPE.class), - any(), anyString(), eq(expectedContributorQueries), any(EventHandler.class)); + any(), anyString(), eq(expectedContributorQueries), any(EventHandler.class)); verifyNoMoreInteractions(alerter); } - + private ContributorQuery[] makeFullQueries(List pillars, IntegrityModel store) { List res = new ArrayList<>(); - for(String pillar : pillars) { + for (String pillar : pillars) { Date latestChecksumDate = new Date(0); res.add(new ContributorQuery(pillar, latestChecksumDate, null, SettingsUtils.DEFAULT_MAX_CLIENT_PAGE_SIZE)); } - + return res.toArray(new ContributorQuery[pillars.size()]); } - + private ContributorQuery[] makeQueries(List pillars, IntegrityModel store) { List res = new ArrayList<>(); - for(String pillar : pillars) { - Date latestChecksumDate = store.getDateForNewestChecksumEntryForPillar(pillar, TEST_COLLECTION); + for (String pillar : pillars) { + Date latestChecksumDate = store.getDateForNewestChecksumEntryForPillar(pillar, TEST_COLLECTION); res.add(new ContributorQuery(pillar, latestChecksumDate, null, SettingsUtils.DEFAULT_MAX_CLIENT_PAGE_SIZE)); } - + return res.toArray(new ContributorQuery[pillars.size()]); } - - private ResultingChecksums createResultingChecksums(String checksum, String ... fileids) { + + private ResultingChecksums createResultingChecksums(String checksum, String... fileids) { ResultingChecksums res = new ResultingChecksums(); 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.getNow()); - csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + try { + csData.setChecksumValue(Base16Utils.encodeBase16(checksum)); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } csData.setFileID(fileID); res.add(csData); } diff --git a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/IdentifyPillarsForPutFileRequestHandler.java b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/IdentifyPillarsForPutFileRequestHandler.java index d98a8933c..83e836df1 100644 --- a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/IdentifyPillarsForPutFileRequestHandler.java +++ b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/messagehandler/IdentifyPillarsForPutFileRequestHandler.java @@ -128,6 +128,7 @@ private void respondDuplicateFile(IdentifyPillarsForPutFileRequest message) thro response.setChecksumDataForExistingFile(getPillarModel().getChecksumDataForFile(message.getFileID(), message.getCollectionID(), ChecksumUtils.getDefault(getSettings()))); + ResponseInfo irInfo = new ResponseInfo(); irInfo.setResponseCode(ResponseCode.DUPLICATE_FILE_FAILURE); response.setResponseInfo(irInfo); diff --git a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/StorageModel.java b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/StorageModel.java index 4336ff3d2..243805eb2 100644 --- a/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/StorageModel.java +++ b/bitrepository-reference-pillar/src/main/java/org/bitrepository/pillar/store/StorageModel.java @@ -24,6 +24,7 @@ */ package org.bitrepository.pillar.store; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ResponseCode; @@ -172,7 +173,12 @@ public ChecksumDataForFileTYPE getChecksumDataForFile(String fileID, String coll ChecksumDataForFileTYPE res = new ChecksumDataForFileTYPE(); res.setCalculationTimestamp(CalendarUtils.getXmlGregorianCalendar(entry.getCalculationDate())); res.setChecksumSpec(csType); - res.setChecksumValue(Base16Utils.encodeBase16(entry.getChecksum())); + try { + res.setChecksumValue(Base16Utils.encodeBase16(entry.getChecksum())); + } catch (DecoderException e) { + throw new IllegalArgumentException("Could not encode checksum.", e); + } + return res; } 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 247d524ff..563b1d08f 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 @@ -21,9 +21,12 @@ */ package org.bitrepository.pillar.store.checksumdatabase; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; import org.bitrepository.common.utils.Base16Utils; import org.bitrepository.common.utils.CalendarUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; @@ -34,6 +37,7 @@ public class ExtractedChecksumResultSet { protected final List entries; protected boolean moreEntriesReported; + private final Logger log = LoggerFactory.getLogger(this.getClass()); public ExtractedChecksumResultSet() { entries = new ArrayList<>(); @@ -57,7 +61,12 @@ public void insertChecksumEntry(ChecksumDataForChecksumSpecTYPE entry) { public void insertChecksumEntry(ChecksumEntry entry) { ChecksumDataForChecksumSpecTYPE res = new ChecksumDataForChecksumSpecTYPE(); res.setCalculationTimestamp(CalendarUtils.getXmlGregorianCalendar(entry.getCalculationDate())); - res.setChecksumValue(Base16Utils.encodeBase16(entry.getChecksum())); + try { + res.setChecksumValue(Base16Utils.encodeBase16(entry.getChecksum())); + } catch (DecoderException e) { + throw new IllegalArgumentException("Could not encode checksum.", e); + } + res.setFileID(entry.getFileId()); entries.add(res); } diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultPillarTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultPillarTest.java index e7ab8ea31..1752dead9 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultPillarTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/DefaultPillarTest.java @@ -21,6 +21,7 @@ */ package org.bitrepository.pillar; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumType; @@ -63,7 +64,11 @@ public abstract class DefaultPillarTest extends DefaultFixturePillarTest { ChecksumSpecTYPE checksumSpecTYPE = new ChecksumSpecTYPE(); checksumSpecTYPE.setChecksumType(ChecksumType.MD5); EMPTY_FILE_CHECKSUM_DATA.setChecksumSpec(checksumSpecTYPE); - EMPTY_FILE_CHECKSUM_DATA.setChecksumValue(Base16Utils.encodeBase16(EMPTY_FILE_CHECKSUM)); + try { + EMPTY_FILE_CHECKSUM_DATA.setChecksumValue(Base16Utils.encodeBase16(EMPTY_FILE_CHECKSUM)); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } } @Override protected void initializeCUT() { diff --git a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MockedPillarTest.java b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MockedPillarTest.java index a84686204..2ef38e40a 100644 --- a/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MockedPillarTest.java +++ b/bitrepository-reference-pillar/src/test/java/org/bitrepository/pillar/MockedPillarTest.java @@ -5,22 +5,23 @@ * 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.pillar; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumType; @@ -75,7 +76,7 @@ protected void createPillar() { PillarAlarmDispatcher alarmDispatcher = new PillarAlarmDispatcher(settingsForCUT, messageBus); context = new MessageHandlerContext(settingsForCUT, SettingsHelper.getPillarCollections(settingsForCUT.getComponentID(), settingsForCUT.getCollections()), - new ResponseDispatcher(settingsForCUT, messageBus), + new ResponseDispatcher(settingsForCUT, messageBus), alarmDispatcher, audits, fileExchangeMock); mediator = new PillarMediator(messageBus, context, model); @@ -84,7 +85,7 @@ protected void createPillar() { csSpec = new ChecksumSpecTYPE(); csSpec.setChecksumSalt(null); csSpec.setChecksumType(ChecksumType.MD5); - + otherCsSpec = new ChecksumSpecTYPE(); otherCsSpec.setChecksumSalt(new byte[]{'a', 'b'}); otherCsSpec.setChecksumType(ChecksumType.HMAC_SHA512); @@ -92,16 +93,21 @@ protected void createPillar() { csData = new ChecksumDataForFileTYPE(); csData.setCalculationTimestamp(CalendarUtils.getEpoch()); csData.setChecksumSpec(csSpec); - csData.setChecksumValue(Base16Utils.encodeBase16(DEFAULT_MD5_CHECKSUM)); NON_DEFAULT_CS = new ChecksumDataForFileTYPE(); NON_DEFAULT_CS.setCalculationTimestamp(CalendarUtils.getEpoch()); NON_DEFAULT_CS.setChecksumSpec(csSpec); - NON_DEFAULT_CS.setChecksumValue(Base16Utils.encodeBase16(NON_DEFAULT_MD5_CHECKSUM)); + + try { + csData.setChecksumValue(Base16Utils.encodeBase16(DEFAULT_MD5_CHECKSUM)); + NON_DEFAULT_CS.setChecksumValue(Base16Utils.encodeBase16(NON_DEFAULT_MD5_CHECKSUM)); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } } public void shutdownMediator() { - if(mediator != null) { + if (mediator != null) { mediator.close(); mediator = null; } 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 7ed6b42b1..f8491c66b 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 @@ -21,6 +21,7 @@ */ package org.bitrepository.pillar.integration.func.deletefile; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumType; import org.bitrepository.bitrepositoryelements.ResponseCode; @@ -95,8 +96,12 @@ public void requestNewChecksumDeleteFileTest() { ChecksumSpecTYPE requestedChecksumSpec = new ChecksumSpecTYPE(); requestedChecksumSpec.setChecksumType(ChecksumType.HMAC_MD5); - requestedChecksumSpec.setChecksumSalt(Base16Utils.encodeBase16("abab")); - + try { + requestedChecksumSpec.setChecksumSalt(Base16Utils.encodeBase16("abab")); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } + DeleteFileRequest deleteRequest = msgFactory.createDeleteFileRequest( TestFileHelper.getDefaultFileChecksum(), requestedChecksumSpec, testSpecificFileID); messageBus.sendMessage(deleteRequest); 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/GetChecksumTest.java index 4ce8bf901..0d43ddef6 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/GetChecksumTest.java @@ -21,6 +21,7 @@ */ package org.bitrepository.pillar.integration.func.getchecksums; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.ChecksumDataForChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; import org.bitrepository.bitrepositoryelements.ChecksumType; @@ -84,7 +85,11 @@ public void md5SaltChecksumsForDefaultTest() throws NegativeResponseException { "The correct of SHA1 checksum should be returned (Not checked yet)."); ChecksumSpecTYPE checksumSpec = new ChecksumSpecTYPE(); checksumSpec.setChecksumType(ChecksumType.HMAC_MD5); - checksumSpec.setChecksumSalt(Base16Utils.encodeBase16("abab")); + try { + checksumSpec.setChecksumSalt(Base16Utils.encodeBase16("abab")); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } List checksums = pillarFileManager.getChecksums( checksumSpec, null, DEFAULT_FILE_ID); assertNotNull(checksums.get(0)); @@ -99,7 +104,11 @@ public void sha1SaltChecksumsForDefaultTest() throws NegativeResponseException { "The correct of SHA1 checksum should be returned (Not checked yet)."); ChecksumSpecTYPE checksumSpec = new ChecksumSpecTYPE(); checksumSpec.setChecksumType(ChecksumType.HMAC_SHA1); - checksumSpec.setChecksumSalt(Base16Utils.encodeBase16("abab")); + try { + checksumSpec.setChecksumSalt(Base16Utils.encodeBase16("abab")); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } List checksums = pillarFileManager.getChecksums( checksumSpec, null, DEFAULT_FILE_ID); assertNotNull(checksums.get(0)); 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/ReplaceFileTest.java index 53bab5e94..fca9c2e9f 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/ReplaceFileTest.java @@ -24,6 +24,7 @@ */ package org.bitrepository.pillar.messagehandling; +import org.apache.commons.codec.DecoderException; import org.bitrepository.bitrepositoryelements.AlarmCode; import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; @@ -66,23 +67,15 @@ public void initializeCUT() { @SuppressWarnings("rawtypes") @Test( groups = {"regressiontest", "pillartest"}) - public void goodCaseIdentification() throws Exception { + public void goodCaseIdentification() { addDescription("Tests the identification for a ReplaceFile operation on the pillar for the successful scenario."); addStep("Set up constants and variables.", "Should not fail here!"); String FILE_ID = DEFAULT_FILE_ID; addStep("Setup for having the file and delivering pillar id", "Should return true, when requesting file-id existence."); - doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return true; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); - doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return settingsForCUT.getComponentID(); - } - }).when(model).getPillarID(); + doAnswer(invocation -> true).when(model).hasFileID(eq(FILE_ID), anyString()); + doAnswer(invocation -> settingsForCUT.getComponentID()).when(model).getPillarID(); addStep("Create and send the identify request message.", "Should be received and handled by the pillar."); @@ -104,23 +97,15 @@ public String answer(InvocationOnMock invocation) { @SuppressWarnings("rawtypes") @Test( groups = {"regressiontest", "pillartest"}) - public void badCaseIdentification() throws Exception { + public void badCaseIdentification() { addDescription("Tests the identification for a ReplaceFile operation on the pillar for the failure scenario, when the file does not exist."); addStep("Set up constants and variables.", "Should not fail here!"); String FILE_ID = DEFAULT_FILE_ID; addStep("Setup for not having the file and delivering pillar id", "Should return false, when requesting file-id existence."); - doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return false; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); - doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return settingsForCUT.getComponentID(); - } - }).when(model).getPillarID(); + doAnswer(invocation -> false).when(model).hasFileID(eq(FILE_ID), anyString()); + doAnswer(invocation -> settingsForCUT.getComponentID()).when(model).getPillarID(); addStep("Create and send the identify request message.", "Should be received and handled by the pillar."); @@ -142,18 +127,14 @@ public String answer(InvocationOnMock invocation) { @SuppressWarnings("rawtypes") @Test( groups = {"regressiontest", "pillartest"}) - public void badCaseOperationMissingFile() throws Exception { + public void badCaseOperationMissingFile() { addDescription("Tests the ReplaceFile operation on the pillar for the failure scenario, when the file is missing."); addStep("Set up constants and variables.", "Should not fail here!"); String FILE_ID = DEFAULT_FILE_ID; addStep("Setup for not having the file and delivering pillar id", "Should return false, when requesting file-id existence."); - doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return false; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); + doAnswer(invocation -> false).when(model).hasFileID(eq(FILE_ID), anyString()); doAnswer(new Answer() { public String answer(InvocationOnMock invocation) { return settingsForCUT.getComponentID(); @@ -178,7 +159,7 @@ public String answer(InvocationOnMock invocation) { @SuppressWarnings("rawtypes") @Test( groups = {"regressiontest", "pillartest"}) - public void badCaseOperationNoDestructiveChecksum() throws Exception { + public void badCaseOperationNoDestructiveChecksum() { addDescription("Tests the ReplaceFile operation on the pillar for the failure scenario, when no validation " + "checksum is given for the destructive action, but though is required."); addStep("Set up constants and variables.", "Should not fail here!"); @@ -187,16 +168,8 @@ public void badCaseOperationNoDestructiveChecksum() throws Exception { addStep("Setup for having the file and delivering pillar id", "Should return true, when requesting file-id existence."); - doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return true; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); - doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return settingsForCUT.getComponentID(); - } - }).when(model).getPillarID(); + doAnswer(invocation -> true).when(model).hasFileID(eq(FILE_ID), anyString()); + doAnswer(invocation -> settingsForCUT.getComponentID()).when(model).getPillarID(); addStep("Create and send the identify request message.", "Should be received and handled by the pillar."); @@ -219,7 +192,7 @@ public String answer(InvocationOnMock invocation) { @SuppressWarnings("rawtypes") @Test( groups = {"regressiontest", "pillartest"}) - public void badCaseOperationNoValidationChecksum() throws Exception { + public void badCaseOperationNoValidationChecksum() { addDescription("Tests the ReplaceFile operation on the pillar for the failure scenario, when no validation " + "checksum is given for the new file, but though is required."); addStep("Set up constants and variables.", "Should not fail here!"); @@ -228,16 +201,8 @@ public void badCaseOperationNoValidationChecksum() throws Exception { addStep("Setup for having the file and delivering pillar id", "Should return true, when requesting file-id existence."); - doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return true; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); - doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return settingsForCUT.getComponentID(); - } - }).when(model).getPillarID(); + doAnswer(invocation -> true).when(model).hasFileID(eq(FILE_ID), anyString()); + doAnswer(invocation -> settingsForCUT.getComponentID()).when(model).getPillarID(); addStep("Create and send the identify request message.", "Should be received and handled by the pillar."); @@ -268,21 +233,9 @@ public void badCaseOperationWrongDestructiveChecksum() throws Exception { addStep("Setup for having the file and delivering pillar id", "Should return true, when requesting file-id existence."); - doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return true; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); - doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return settingsForCUT.getComponentID(); - } - }).when(model).getPillarID(); - doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return NON_DEFAULT_MD5_CHECKSUM; - } - }).when(model).getChecksumForFile(anyString(), anyString(), any(ChecksumSpecTYPE.class)); + doAnswer(invocation -> true).when(model).hasFileID(eq(FILE_ID), anyString()); + doAnswer(invocation -> settingsForCUT.getComponentID()).when(model).getPillarID(); + doAnswer(invocation -> NON_DEFAULT_MD5_CHECKSUM).when(model).getChecksumForFile(anyString(), anyString(), any(ChecksumSpecTYPE.class)); addStep("Create and send the identify request message.", "Should be received and handled by the pillar."); @@ -312,21 +265,9 @@ public void goodCaseOperation() throws Exception { addStep("Setup for already having the file and delivering pillar id", "Should return true, when requesting file-id existence."); - doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return true; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); - doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return settingsForCUT.getComponentID(); - } - }).when(model).getPillarID(); - doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return DEFAULT_MD5_CHECKSUM; - } - }).when(model).getChecksumForFile(anyString(), anyString(), any(ChecksumSpecTYPE.class)); + doAnswer(invocation -> true).when(model).hasFileID(eq(FILE_ID), anyString()); + doAnswer(invocation -> settingsForCUT.getComponentID()).when(model).getPillarID(); + doAnswer(invocation -> DEFAULT_MD5_CHECKSUM).when(model).getChecksumForFile(anyString(), anyString(), any(ChecksumSpecTYPE.class)); addStep("Create and send the identify request message.", "Should be received and handled by the pillar."); @@ -364,38 +305,26 @@ public void goodCaseOperationWithChecksumsReturn() throws Exception { addStep("Setup for already having the file and delivering pillar id", "Should return true, when requesting file-id existence."); - doAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) { - return true; - } - }).when(model).hasFileID(eq(FILE_ID), anyString()); - doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return settingsForCUT.getComponentID(); - } - }).when(model).getPillarID(); - doAnswer(new Answer() { - public String answer(InvocationOnMock invocation) { - return DEFAULT_MD5_CHECKSUM; - } - }).when(model).getChecksumForFile(anyString(), anyString(), any(ChecksumSpecTYPE.class)); - doAnswer(new Answer() { - public ChecksumDataForFileTYPE answer(InvocationOnMock invocation) { - ChecksumDataForFileTYPE res = new ChecksumDataForFileTYPE(); - res.setChecksumSpec(otherCsSpec); - res.setCalculationTimestamp(CalendarUtils.getNow()); + doAnswer(invocation -> true).when(model).hasFileID(eq(FILE_ID), anyString()); + doAnswer(invocation -> settingsForCUT.getComponentID()).when(model).getPillarID(); + doAnswer(invocation -> DEFAULT_MD5_CHECKSUM).when(model).getChecksumForFile(anyString(), anyString(), any(ChecksumSpecTYPE.class)); + doAnswer(invocation -> { + ChecksumDataForFileTYPE res = new ChecksumDataForFileTYPE(); + res.setChecksumSpec(otherCsSpec); + res.setCalculationTimestamp(CalendarUtils.getNow()); + try { res.setChecksumValue(Base16Utils.encodeBase16(NON_DEFAULT_MD5_CHECKSUM)); - return res; - } + } catch (DecoderException e) { + e.printStackTrace(); + } + return res; }).when(model).getChecksumDataForFile(anyString(), anyString(), eq(otherCsSpec)); - doAnswer(new Answer() { - public ChecksumDataForFileTYPE answer(InvocationOnMock invocation) { - ChecksumDataForFileTYPE res = new ChecksumDataForFileTYPE(); - res.setChecksumSpec(csSpec); - res.setCalculationTimestamp(CalendarUtils.getNow()); - res.setChecksumValue(Base16Utils.encodeBase16(DEFAULT_MD5_CHECKSUM)); - return res; - } + doAnswer(invocation -> { + ChecksumDataForFileTYPE res = new ChecksumDataForFileTYPE(); + res.setChecksumSpec(csSpec); + res.setCalculationTimestamp(CalendarUtils.getNow()); + res.setChecksumValue(Base16Utils.encodeBase16(DEFAULT_MD5_CHECKSUM)); + return res; }).when(model).getChecksumDataForFile(anyString(), anyString(), eq(csSpec)); addStep("Create and send the identify request message.",