From 048dae574a5d8b1ec20f52408358f3d4c8a108b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20S=C3=B8by?= Date: Thu, 30 Jun 2022 13:20:07 +0200 Subject: [PATCH 1/2] Fixed exceptions being thrown if the commandline client arguments for the checksum algorithm or the hexstring wwas incorrect. Now it will return an easily readable message that tells the user what is wrong. --- .../preserver/LocalAuditTrailPreserver.java | 7 +- .../commandline/CommandLineClient.java | 59 +++-- .../utils/ChecksumExtractionUtils.java | 20 +- .../conversation/ReplacingFile.java | 3 +- .../common/utils/Base16Utils.java | 4 +- .../common/utils/ChecksumUtils.java | 6 +- .../common/utils/Base16UtilsTest.java | 26 +-- .../common/utils/TestFileHelper.java | 35 +-- .../utils/MessageDataTypeValidatorTest.java | 11 +- .../workflow/SaltedChecksumWorkflow.java | 9 +- .../workflow/step/PutFileStep.java | 13 +- .../cache/IntegrityDAOTest.java | 7 +- .../cache/IntegrityDBToolsTest.java | 7 +- .../cache/IntegrityDatabaseTest.java | 19 +- .../integrationtest/MissingChecksumTests.java | 17 +- .../workflow/SaltedChecksumWorkflowTest.java | 219 +++++++++--------- .../step/GetChecksumForFileStepTest.java | 123 +++++----- .../HandleChecksumValidationStepTest.java | 41 ++-- .../step/UpdateChecksumsStepTest.java | 158 +++++++------ ...entifyPillarsForPutFileRequestHandler.java | 1 + .../pillar/store/StorageModel.java | 8 +- .../ExtractedChecksumResultSet.java | 11 +- .../pillar/DefaultPillarTest.java | 7 +- .../pillar/MockedPillarTest.java | 26 ++- .../func/deletefile/DeleteFileRequestIT.java | 9 +- .../func/getchecksums/GetChecksumTest.java | 13 +- .../messagehandling/ReplaceFileTest.java | 149 ++++-------- 27 files changed, 529 insertions(+), 479 deletions(-) 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 b83ab1204..8cb82be30 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.audittrails.store.AuditTrailStore; import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE; import org.bitrepository.bitrepositoryelements.ChecksumSpecTYPE; @@ -161,7 +162,11 @@ private ChecksumDataForFileTYPE getValidationChecksumDataForFile(File file) { 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) { + log.error(e.getMessage()); + } return res; } 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..e7dd32be3 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; } @@ -351,12 +359,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 +392,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..a51f8371d 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()); @@ -51,7 +52,11 @@ public void validateChecksumDataForFileInvalidChecksumSpecTest() { ChecksumDataForFileTYPE noChecksumSpec = new ChecksumDataForFileTYPE(); ChecksumSpecTYPE checksumTypeSpec = new ChecksumSpecTYPE(); noChecksumSpec.setChecksumSpec(checksumTypeSpec); - noChecksumSpec.setChecksumValue(Base16Utils.encodeBase16("abab")); + try { + noChecksumSpec.setChecksumValue(Base16Utils.encodeBase16("abab")); + } catch (DecoderException e) { + System.err.println(e.getMessage()); + } noChecksumSpec.setCalculationTimestamp(CalendarUtils.getNow()); MessageDataTypeValidator.validate(noChecksumSpec, "noChecksumSpec"); 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..2d1cdf3c5 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; /** @@ -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) { + log.error(e.getMessage()); + } 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..266270c09 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) { + log.error(e.getMessage()); + } + 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..5270ab082 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) { + log.error(e.getMessage()); + } + 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.", From dc9f935139cdc116162f37719275bb05a21f20f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20S=C3=B8by?= Date: Fri, 5 Aug 2022 14:02:24 +0200 Subject: [PATCH 2/2] Performed changes pointed out in the review. --- .../preserver/LocalAuditTrailPreserver.java | 10 ++++------ .../bitrepository/commandline/CommandLineClient.java | 3 +-- .../org/bitrepository/common/utils/ChecksumUtils.java | 3 +-- .../protocol/utils/MessageDataTypeValidatorTest.java | 8 ++------ .../workflow/SaltedChecksumWorkflow.java | 4 ++-- .../org/bitrepository/pillar/store/StorageModel.java | 2 +- .../checksumdatabase/ExtractedChecksumResultSet.java | 2 +- 7 files changed, 12 insertions(+), 20 deletions(-) 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 8cb82be30..9574c16c3 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 @@ -149,24 +149,22 @@ 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); ChecksumDataForFileTYPE res = new ChecksumDataForFileTYPE(); res.setCalculationTimestamp(CalendarUtils.getNow()); res.setChecksumSpec(csSpec); - try { - res.setChecksumValue(Base16Utils.encodeBase16(checksum)); - } catch (DecoderException e) { - log.error(e.getMessage()); - } + res.setChecksumValue(Base16Utils.encodeBase16(checksum)); return res; } 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 e7dd32be3..c4cf0dbc2 100644 --- a/bitrepository-client/src/main/java/org/bitrepository/commandline/CommandLineClient.java +++ b/bitrepository-client/src/main/java/org/bitrepository/commandline/CommandLineClient.java @@ -312,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()); } } diff --git a/bitrepository-core/src/main/java/org/bitrepository/common/utils/ChecksumUtils.java b/bitrepository-core/src/main/java/org/bitrepository/common/utils/ChecksumUtils.java index 24966bdab..bd57efe53 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/common/utils/ChecksumUtils.java +++ b/bitrepository-core/src/main/java/org/bitrepository/common/utils/ChecksumUtils.java @@ -272,8 +272,7 @@ public static ChecksumSpecTYPE getDefault(Settings settings) { try { verifyAlgorithm(res); } catch (NoSuchAlgorithmException e) { - System.err.println("The default settings file contains an invalid checksum spec."); - System.exit(1); + throw new IllegalArgumentException("The settings contains an invalid default checksum specification.", e); } return res; 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 a51f8371d..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 @@ -48,15 +48,11 @@ public void validateChecksumDataForFileNoChecksumSpecTest() throws DecoderExcept } //@Test(expectedExceptions = {IllegalArgumentException.class}) - public void validateChecksumDataForFileInvalidChecksumSpecTest() { + public void validateChecksumDataForFileInvalidChecksumSpecTest() throws DecoderException { ChecksumDataForFileTYPE noChecksumSpec = new ChecksumDataForFileTYPE(); ChecksumSpecTYPE checksumTypeSpec = new ChecksumSpecTYPE(); noChecksumSpec.setChecksumSpec(checksumTypeSpec); - try { - noChecksumSpec.setChecksumValue(Base16Utils.encodeBase16("abab")); - } catch (DecoderException e) { - System.err.println(e.getMessage()); - } + noChecksumSpec.setChecksumValue(Base16Utils.encodeBase16("abab")); noChecksumSpec.setCalculationTimestamp(CalendarUtils.getNow()); MessageDataTypeValidator.validate(noChecksumSpec, "noChecksumSpec"); 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 2d1cdf3c5..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 @@ -107,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(); @@ -133,7 +133,7 @@ private ChecksumSpecTYPE getChecksumSpecWithRandomSalt() { try { res.setChecksumSalt(Base16Utils.encodeBase16(salt)); } catch (DecoderException e) { - log.error(e.getMessage()); + throw new IllegalArgumentException("Failed to set random salt.", e); } return res; 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 266270c09..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 @@ -176,7 +176,7 @@ public ChecksumDataForFileTYPE getChecksumDataForFile(String fileID, String coll try { res.setChecksumValue(Base16Utils.encodeBase16(entry.getChecksum())); } catch (DecoderException e) { - log.error(e.getMessage()); + 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 5270ab082..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 @@ -64,7 +64,7 @@ public void insertChecksumEntry(ChecksumEntry entry) { try { res.setChecksumValue(Base16Utils.encodeBase16(entry.getChecksum())); } catch (DecoderException e) { - log.error(e.getMessage()); + throw new IllegalArgumentException("Could not encode checksum.", e); } res.setFileID(entry.getFileId());