From 70fb8d7ee6467363c3232ddabb5975aac6841a08 Mon Sep 17 00:00:00 2001 From: cramakri <cramakri> Date: Tue, 10 Jul 2012 09:25:37 +0000 Subject: [PATCH] BIS-21 SP-177 : Developing tests for this situation SVN: 26047 --- .../AbstractJythonDataSetHandlerTest.java | 5 +- .../JythonTopLevelDataSetRegistratorTest.java | 172 +++++++++++++++++- .../v2-delete-after-registration.py | 25 +++ .../v2-delete-before-registration.py | 24 +++ 4 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py create mode 100644 datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java index 0e00657647d..6dd3eaf29d0 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java @@ -196,7 +196,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste cleanUpDirectoryBeforeTheTest(recoveryStateDir); DssRegistrationHealthMonitor.setOpenBisServiceForTest(openBisService); - + JythonHookTestTool.createInTest().clear(); } @@ -320,7 +320,8 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste String validationScriptPropertyOrNull, HashMap<String, String> overrideOrNull) { Properties threadProperties = new Properties(); - threadProperties.setProperty(ThreadParameters.INCOMING_DIR, "incoming"); + threadProperties.setProperty(ThreadParameters.INCOMING_DIR, + workingDirectory.getAbsolutePath()); threadProperties.setProperty(ThreadParameters.INCOMING_DATA_COMPLETENESS_CONDITION, ThreadParameters.INCOMING_DATA_COMPLETENESS_CONDITION_MARKER_FILE); threadProperties.setProperty(ThreadParameters.DELETE_UNIDENTIFIED_KEY, "false"); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java index 28b62fca036..6b867e47f01 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java @@ -33,6 +33,7 @@ import java.util.Properties; import org.jmock.Expectations; import org.jmock.api.Invocation; +import org.jmock.internal.ExpectationBuilder; import org.jmock.lib.action.CustomAction; import org.python.core.PyException; import org.testng.annotations.BeforeMethod; @@ -50,6 +51,7 @@ import ch.systemsx.cisd.common.test.RecordingMatcher; import ch.systemsx.cisd.common.utilities.IDelegatedAction; import ch.systemsx.cisd.common.utilities.IPredicate; import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional; +import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState; import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional.UnstoreDataAction; import ch.systemsx.cisd.etlserver.ThreadParameters; import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DatasetLocationUtil; @@ -127,16 +129,14 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH return new File(script.getParentFile(), "v2-" + script.getName()).getPath(); } - @DataProvider(name = "simpleTransactionTestCaseProvider") - public Object[][] simpleTransactionCases() + private static <T> Object[][] asObjectArray(List<T> testCases) { - List<TestCaseParameters> testCases = simpleTransactionCasesList(); // here is crappy code for // return parameters.map( (x) => new Object[]{x} ) Object[][] resultsList = new Object[testCases.size()][]; int index = 0; - for (TestCaseParameters t : testCases) + for (T t : testCases) { resultsList[index++] = new Object[] { t }; @@ -145,6 +145,13 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH return resultsList; } + @DataProvider(name = "simpleTransactionTestCaseProvider") + public Object[][] simpleTransactionCases() + { + List<TestCaseParameters> testCases = simpleTransactionCasesList(); + return asObjectArray(testCases); + } + public List<TestCaseParameters> simpleTransactionCasesList() { // creates data with more than only one dataset @@ -859,6 +866,163 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH jythonHookTestTool.assertNoMoreMessages(); } + /** + * Parameters for the single run of the testIncomingFileDeleted + * + * @author Chandrasekhar Ramakrishnan + */ + private static class IncomingFileDeletedTestCaseParameters implements Cloneable + { + /** + * short description of the test. Will be presented in the test results view + */ + protected String title; + + /** + * The dropbox script file that should be used for this test case + */ + protected String dropboxScriptPath = scriptPathV2("simple-testcase.py"); + + /** + * Specifies what properties should be overriden for this test case. + */ + protected HashMap<String, String> overrideProperties; + + /** + * When does this incoming file get deleted? + */ + protected DeletionPoint deletionPoint = null; + + private IncomingFileDeletedTestCaseParameters(String title) + { + this.title = title; + this.overrideProperties = new HashMap<String, String>(); + } + + @Override + public IncomingFileDeletedTestCaseParameters clone() + { + try + { + return (IncomingFileDeletedTestCaseParameters) super.clone(); + } catch (CloneNotSupportedException e) + { + return null; + } + } + + @Override + public String toString() + { + return title; + } + + public TestCaseParameters toTestCaseParameters() + { + TestCaseParameters testCase = new TestCaseParameters(title); + testCase.shouldUseAutoRecovery = true; + + return testCase; + } + + public enum DeletionPoint + { + DURING_PRECOMMIT_COPY, BEFORE_OPENBIS_REGISTRATION, AFTER_OPENBIS_REGISTRATION; + } + } + + @DataProvider(name = "incomingFileDeletedTestCaseProvider") + public Object[][] incomingFileDeletedCases() + { + List<IncomingFileDeletedTestCaseParameters> testCases = incomingFileDeletedCasesList(); + return asObjectArray(testCases); + } + + public List<IncomingFileDeletedTestCaseParameters> incomingFileDeletedCasesList() + { + + ArrayList<IncomingFileDeletedTestCaseParameters> testCases = + new ArrayList<IncomingFileDeletedTestCaseParameters>(); + + // Delete the incoming file while the prestaging copy is being made + IncomingFileDeletedTestCaseParameters testCase = + new IncomingFileDeletedTestCaseParameters( + "Incoming file deleted during prestaging copy."); + testCase.deletionPoint = + IncomingFileDeletedTestCaseParameters.DeletionPoint.DURING_PRECOMMIT_COPY; + testCases.add(testCase); + + // Delete the incoming file after the prestaging copy has been made, but before the metadata + // has been registered with the AS + testCase = + new IncomingFileDeletedTestCaseParameters( + "Incoming file deleted before metadata registration."); + testCase.dropboxScriptPath = scriptPathV2("delete-before-registration.py"); + testCase.deletionPoint = + IncomingFileDeletedTestCaseParameters.DeletionPoint.BEFORE_OPENBIS_REGISTRATION; + testCases.add(testCase); + + // Delete the incoming file after the metadata has been registered with the AS + testCase = + new IncomingFileDeletedTestCaseParameters( + "Incoming file deleted after metadata registration."); + testCase.dropboxScriptPath = scriptPathV2("delete-after-registration.py"); + testCase.deletionPoint = + IncomingFileDeletedTestCaseParameters.DeletionPoint.AFTER_OPENBIS_REGISTRATION; + testCases.add(testCase); + + return testCases; + } + + @Test(dataProvider = "incomingFileDeletedTestCaseProvider") + public void testIncomingFileDeleted(final IncomingFileDeletedTestCaseParameters testCase) + { + // Not yet handled + if (testCase.deletionPoint == IncomingFileDeletedTestCaseParameters.DeletionPoint.DURING_PRECOMMIT_COPY) + { + return; + } + initializeStorageRecoveryManagerMock(); + setUpHomeDataBaseExpectations(); + + Properties properties = + createThreadPropertiesRelativeToScriptsFolder(testCase.dropboxScriptPath, + testCase.overrideProperties); + + // Create the handler + TopLevelDataSetRegistratorGlobalState globalState = createGlobalState(properties); + handler = new TestingDataSetHandlerV2(globalState, false, false); + + createDataWithOneSubDataSet(); + + final RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails> atomicOperationDetails = + new RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails>(); + context.checking(getTestIncomingFileDeletedExcpectations(testCase, atomicOperationDetails)); + handler.handle(markerFile); + + if (testCase.deletionPoint == IncomingFileDeletedTestCaseParameters.DeletionPoint.AFTER_OPENBIS_REGISTRATION) + { + assertEquals(1, MockStorageProcessor.instance.incomingDirs.size()); + assertEquals(1, MockStorageProcessor.instance.calledCommitCount); + } else + { + assertEquals(0, MockStorageProcessor.instance.incomingDirs.size()); + assertEquals(0, MockStorageProcessor.instance.calledCommitCount); + + } + + assertEquals("[]", Arrays.asList(stagingDirectory.list()).toString()); + context.assertIsSatisfied(); + } + + private ExpectationBuilder getTestIncomingFileDeletedExcpectations( + final IncomingFileDeletedTestCaseParameters testCase, + final RecordingMatcher<AtomicEntityOperationDetails> atomicOperationDetails) + { + return getSimpleTransactionExpectations(testCase.toTestCaseParameters(), + atomicOperationDetails); + } + @Test public void testTwoSimpleDataSets() { diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py new file mode 100644 index 00000000000..1130ccdee95 --- /dev/null +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py @@ -0,0 +1,25 @@ +from java.lang import IllegalArgumentException +from java.io import File + +execfile("sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py") + +def post_metadata_registration(context): + path_to_delete = context.getPersistentMap().get("path") + file_to_delete = File(path_to_delete) + file_to_delete.delete() + jythonHookTestTool.log("post_metadata_registration") + +def process(tr): + # Remember the original file so we can delete it before we do metadata registration + incomingDir = tr.getGlobalState().getThreadParameters().getIncomingDataDirectory() + original = File(incomingDir, tr.getIncoming().getName()) + context = tr.getRegistrationContext() + context.getPersistentMap().put("path", original.getPath()) + + dataSet = tr.createNewDataSet() + incoming = tr.getIncoming() + tr.moveFile(incoming.getPath() + '/sub_data_set_1', dataSet) + dataSet.setDataSetType('O1') + dataSet.setExperiment(tr.getExperiment('/SPACE/PROJECT/EXP')) + + diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py new file mode 100644 index 00000000000..7a3206ddbfe --- /dev/null +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py @@ -0,0 +1,24 @@ +from java.lang import IllegalArgumentException +from java.io import File + +execfile("sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py") + +def pre_metadata_registration(context): + path_to_delete = context.getPersistentMap().get("path") + file_to_delete = File(path_to_delete) + file_to_delete.delete() + jythonHookTestTool.log("pre_metadata_registration") + +def process(tr): + # Remember the original file so we can delete it before we do metadata registration + incomingDir = tr.getGlobalState().getThreadParameters().getIncomingDataDirectory() + original = File(incomingDir, tr.getIncoming().getName()) + context = tr.getRegistrationContext() + context.getPersistentMap().put("path", original.getPath()) + + dataSet = tr.createNewDataSet() + incoming = tr.getIncoming() + tr.moveFile(incoming.getPath() + '/sub_data_set_1', dataSet) + dataSet.setDataSetType('O1') + dataSet.setExperiment(tr.getExperiment('/SPACE/PROJECT/EXP')) + -- GitLab