diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java index 39c00bd9d7ea5256eb82a468176c23a938b74cf9..79fcf66749c80115f2881919f3769de163b5bf4b 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java @@ -215,6 +215,7 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest RecoveryInfoDateConstraint.ORIGINAL, testCase.recoveryLastTry); assertOriginalMarkerFileExists(); assertDirNotEmpty(precommitDirectory, "Precommit directory should not be empty"); + assertJythonHooks("pre_metadata_registration"); // nothing happened } else { @@ -234,6 +235,8 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest assertNoRecoveryMarkerFile(); assertDirEmpty(stagingDirectory); + + assertJythonHooks("pre_metadata_registration", "rollback_pre_registration"); // FIXME: this check is commented out because of a bug! // assertDirEmpty(precommitDirectory); @@ -241,10 +244,25 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest // rolllback requirementes } + private void assertJythonHooks(String... messages) + { + JythonHookTestTool jythonHookTestTool = + JythonHookTestTool.createFromWorkingDirectory(workingDirectory); + for (String msg : messages) + { + jythonHookTestTool.assertLogged(msg); + } + jythonHookTestTool.assertNoMoreMessages(); + } + private void assertPostRecoveryConstraints( final RecoveryTestCase testCase, final RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails> atomicatOperationDetails) { + JythonHookTestTool jythonHookTestTool = + JythonHookTestTool.createFromWorkingDirectory(workingDirectory); + // the check from the original registration + jythonHookTestTool.assertLogged("pre_metadata_registration"); switch (testCase.registrationCheckResult) { @@ -258,6 +276,10 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest assertNoOriginalMarkerFileExists(); assertNoRecoveryMarkerFile(); + + // the hooks after successful registration + jythonHookTestTool.assertLogged("post_metadata_registration"); + jythonHookTestTool.assertLogged("post_storage"); break; case REGISTRATION_FAILED: assertDataSetNotStoredProcess(DATA_SET_CODE); @@ -268,6 +290,8 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest assertNoOriginalMarkerFileExists(); assertNoRecoveryMarkerFile(); + + jythonHookTestTool.assertLogged("rollback_pre_registration"); break; case CHECK_FAILED: assertDataSetNotStoredProcess(DATA_SET_CODE); @@ -288,7 +312,7 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest break; } - + jythonHookTestTool.assertNoMoreMessages(); } /** diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonHookTestTool.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonHookTestTool.java new file mode 100644 index 0000000000000000000000000000000000000000..447a0751f050ad8d4615caf84ddc97f3fd99a429 --- /dev/null +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonHookTestTool.java @@ -0,0 +1,142 @@ +/* + * Copyright 2012 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.etlserver.registrator; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; +import java.util.Scanner; + +/** + * The helper class to assert jython hooks. The jython hooks can log into the working directory, and + * the test classes can compare what the script has logged with expectations + * + * @author jakubs + */ +public class JythonHookTestTool +{ + private final File logFile; + + private String[] originalFileContents; + + private int lineNumber; + + private JythonHookTestTool(File workingDirectory) + { + this.logFile = new File(workingDirectory, "jython_hook_test"); + if (logFile.exists()) + { + readContents(); + } + lineNumber = 0; + } + + private void readContents() + { + try + { + final Scanner s = new Scanner(logFile); + + List<String> list = new LinkedList<String>(); + + while (s.hasNextLine()) + { + final String line = s.nextLine(); + list.add(line); + } + originalFileContents = list.toArray(new String[0]); + } catch (FileNotFoundException fnfe) + { + throw new RuntimeException( + "Impossible as we check if the file exists before creating scanner", fnfe); + } + } + + /** + * The factory method to create util + * + * @param incoming - pre-staging copy of the file - the logical incoming available from the + * dropbox + */ + public static JythonHookTestTool createFromIncoming(File incoming) + { + File workingDirectory = incoming.getParentFile().getParentFile().getParentFile(); + return new JythonHookTestTool(workingDirectory); + } + + /** + * @param workingDirectory - the working directory of the test class + */ + public static JythonHookTestTool createFromWorkingDirectory(File workingDirectory) + { + return new JythonHookTestTool(workingDirectory); + } + + /** + * Use this method in the dropbox to log some information during registration + * + * @param message - message that will be logged with a \n at the end + */ + public void log(String message) throws IOException + { + BufferedWriter output = null; + try + { + output = new BufferedWriter(new FileWriter(logFile, true)); + output.write(message); + output.newLine(); + } finally + { + if (output != null) + { + output.close(); + } + } + } + + /** + * Method to use in the test to assert that the given messages were written to the file in the + * specified order + */ + public void assertLogged(String message) + { + if (lineNumber >= originalFileContents.length) + { + throw new AssertionError("Missing message in jython hook test " + message); + } + String line = originalFileContents[lineNumber]; + if (false == line.equals(message)) + { + throw new AssertionError("Mismatch in jython hook test. Expected " + message + + " but got " + line); + } + lineNumber++; + } + + public void assertNoMoreMessages() + { + if (lineNumber < originalFileContents.length) + { + throw new AssertionError("Unexpected message in jython hook test." + + originalFileContents[lineNumber]); + } + } +} diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py index 330495c24cfe5a63d8842f4f13b900e52c23be6b..bcdac4ad7e12d936ea4a712ef0e1392e840295a5 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py @@ -1,23 +1,33 @@ +from ch.systemsx.cisd.etlserver.registrator import JythonHookTestTool + +jythonHookTestTool = JythonHookTestTool.createFromIncoming(incoming) + def rollback_transaction(service, transaction, algorithmRunner, throwable): global didTransactionRollbackHappen didTransactionRollbackHappen = True + jythonHookTestTool.log("rollback_transaction") def rollback_pre_registration(context, throwable): global didPreRegistrationRollbackHappen didPreRegistrationRollbackHappen = True + jythonHookTestTool.log("rollback_pre_registration") def commit_transaction(service, transaction): global didTransactionCommitHappen didTransactionCommitHappen = True + jythonHookTestTool.log("commit_transaction") def post_storage(context): global didPostStorageFunctionRunHappen didPostStorageFunctionRunHappen = True + jythonHookTestTool.log("post_storage") def pre_metadata_registration(context): global didPreRegistrationFunctionRunHappen didPreRegistrationFunctionRunHappen = True + jythonHookTestTool.log("pre_metadata_registration") def post_metadata_registration(context): global didPostRegistrationFunctionRunHappen didPostRegistrationFunctionRunHappen = True + jythonHookTestTool.log("post_metadata_registration")