From a7c77bc8af6852f69d983921a1b7d76ad005d253 Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Mon, 21 Mar 2011 09:22:44 +0000
Subject: [PATCH] minor: test indices should not be used directly from the
 "source" directory. we copy them to "targets" instead. this could allow
 future tests to damage or alter the index files if needed.

SVN: 20414
---
 .../dataaccess/db/HibernateSearchDAOTest.java | 228 ++++++++----------
 .../generic/server/util/TestInitializer.java  |  34 ++-
 2 files changed, 138 insertions(+), 124 deletions(-)

diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java
index d9149c0b5b8..bfc71d97868 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java
@@ -24,9 +24,13 @@ import static org.testng.AssertJUnit.fail;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import org.hibernate.classic.Session;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
 import org.testng.AssertJUnit;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
@@ -34,6 +38,7 @@ import org.testng.annotations.Test;
 import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.common.test.AssertionUtil;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IHibernateSearchDAO;
+import ch.systemsx.cisd.openbis.generic.server.util.TestInitializer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetAttributeSearchFieldKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchAssociationCriteria;
@@ -43,7 +48,10 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SearchCriteriaConnection;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetPropertyPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
@@ -62,32 +70,6 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 public final class HibernateSearchDAOTest extends AbstractDAOTest
 {
 
-    // private final static String LUCENE_INDEX_TEMPLATE_PATH = "./sourceTest/lucene/indices";
-    //
-    // @BeforeClass
-    // public void setUpIndex()
-    // {
-    // restoreSearchIndex();
-    // }
-    //
-    // // create a fresh copy of the Lucene index
-    // private static void restoreSearchIndex()
-    // {
-    // File targetPath = new File(TestInitializer.LUCENE_INDEX_PATH);
-    // FileUtilities.deleteRecursively(targetPath);
-    // targetPath.mkdirs();
-    // File srcPath = new File(LUCENE_INDEX_TEMPLATE_PATH);
-    // try
-    // {
-    // FileUtils.copyDirectory(srcPath, targetPath);
-    // new File(srcPath, FullTextIndexerRunnable.FULL_TEXT_INDEX_MARKER_FILENAME)
-    // .createNewFile();
-    // } catch (IOException ex)
-    // {
-    // throw new IOExceptionUnchecked(ex);
-    // }
-    // }
-
     @SuppressWarnings("unused")
     @DataProvider(name = "registratorTerm")
     private final static Object[][] getRegistratorTerm()
@@ -508,102 +490,102 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest
     // }
 
     // TODO 2010-10-22, Piotr Buczek: write a different test (auto update is switched off)
-    // @Test(groups = "broken")
-    // /*
-    // * Checks if the dataset search index is properly updated after properties of a dataset have
-    // * changed.
-    // */
-    // public final void testSearchForDataSetsAfterPropertiesUpdate() throws InterruptedException
-    // {
-    // String propertyCode = "COMMENT";
-    // DetailedSearchCriterion criterion1 =
-    // mkCriterion(DetailedSearchField.createPropertyField(propertyCode), "no comment");
-    // DetailedSearchCriterion criterion2 = createSimpleFieldCriterion();
-    //
-    // DetailedSearchCriteria criteria = createAndDatasetQuery(criterion1, criterion2);
-    //
-    // assertCorrectDatasetsFound(criteria, DSLoc.LOC3, DSLoc.LOC4);
-    //
-    // // This data set has "no comment" value as a COMMENT property and TIFF file type.
-    // // We change it and check if it is removed from results.
-    // ExternalDataPE externalData = findExternalData("20081105092159111-1"); // LOC3
-    // String newValue = "sth";
-    // changeExternalDataProperty(externalData, propertyCode, newValue);
-    // flushSearchIndices();
-    // assertCorrectDatasetsFound(criteria, DSLoc.LOC4);
-    // restoreSearchIndex();
-    // }
-    //
-    // private void flushSearchIndices()
-    // {
-    // Session currentSession = sessionFactory.getCurrentSession();
-    // FullTextSession fullTextSession = Search.getFullTextSession(currentSession);
-    // fullTextSession.flushToIndexes();
-    // }
-//
-//    private void flushSession()
-//    {
-//        sessionFactory.getCurrentSession().flush();
-//    }
-//
-//    private void changeExternalDataProperty(ExternalDataPE externalData, String propertyCode,
-//            String newValue)
-//    {
-//        EntityPropertyPE property = findProperty(externalData, propertyCode);
-//
-//        removeProperty(externalData, property);
-//        flushSession();
-//
-//        DataSetPropertyPE newProperty = new DataSetPropertyPE();
-//        copyPropertyWithNewValue(newValue, property, newProperty);
-//        addProperty(externalData, newProperty);
-//        flushSession();
-//    }
-//
-//    private void copyPropertyWithNewValue(String newValue, EntityPropertyPE oldProperty,
-//            EntityPropertyPE newProperty)
-//    {
-//        newProperty.setEntityTypePropertyType(oldProperty.getEntityTypePropertyType());
-//        newProperty.setRegistrator(oldProperty.getRegistrator());
-//        newProperty.setValue(newValue);
-//    }
-//
-//    private static <T extends EntityPropertyPE> void addProperty(
-//            IEntityPropertiesHolder propertiesHolder, T newProperty)
-//    {
-//        Set<EntityPropertyPE> properties = getCopiedProperties(propertiesHolder);
-//        properties.add(newProperty);
-//        propertiesHolder.setProperties(properties);
-//    }
-//
-//    private static Set<EntityPropertyPE> removeProperty(IEntityPropertiesHolder propertiesHolder,
-//            EntityPropertyPE property)
-//    {
-//        Set<EntityPropertyPE> properties = getCopiedProperties(propertiesHolder);
-//        boolean removed = properties.remove(property);
-//        assert removed : "property could not be removed";
-//        propertiesHolder.setProperties(properties);
-//        return properties;
-//    }
-//
-//    private static Set<EntityPropertyPE> getCopiedProperties(
-//            IEntityPropertiesHolder propertiesHolder)
-//    {
-//        return new HashSet<EntityPropertyPE>(propertiesHolder.getProperties());
-//    }
-//
-//    private static EntityPropertyPE findProperty(IEntityPropertiesHolder propertiesHolder,
-//            String propertyCode)
-//    {
-//        for (EntityPropertyPE prop : propertiesHolder.getProperties())
-//        {
-//            if (prop.getEntityTypePropertyType().getPropertyType().getCode().equals(propertyCode))
-//            {
-//                return prop;
-//            }
-//        }
-//        fail("property not found: " + propertyCode);
-//        return null; // never happens
-//    }
+    @Test(groups = "broken")
+    /*
+     * Checks if the dataset search index is properly updated after properties of a dataset have
+     * changed.
+     */
+    public final void testSearchForDataSetsAfterPropertiesUpdate() throws InterruptedException
+    {
+        String propertyCode = "COMMENT";
+        DetailedSearchCriterion criterion1 =
+                mkCriterion(DetailedSearchField.createPropertyField(propertyCode), "no comment");
+        DetailedSearchCriterion criterion2 = createSimpleFieldCriterion();
+
+        DetailedSearchCriteria criteria = createAndDatasetQuery(criterion1, criterion2);
+
+        assertCorrectDatasetsFound(criteria, DSLoc.LOC3, DSLoc.LOC4);
+
+        // This data set has "no comment" value as a COMMENT property and TIFF file type.
+        // We change it and check if it is removed from results.
+        ExternalDataPE externalData = findExternalData("20081105092159111-1"); // LOC3
+        String newValue = "sth";
+        changeExternalDataProperty(externalData, propertyCode, newValue);
+        flushSearchIndices();
+        assertCorrectDatasetsFound(criteria, DSLoc.LOC4);
+        TestInitializer.restoreSearchIndex();
+    }
+
+    private void flushSearchIndices()
+    {
+        Session currentSession = sessionFactory.getCurrentSession();
+        FullTextSession fullTextSession = Search.getFullTextSession(currentSession);
+        fullTextSession.flushToIndexes();
+    }
+
+    private void flushSession()
+    {
+        sessionFactory.getCurrentSession().flush();
+    }
+
+    private void changeExternalDataProperty(ExternalDataPE externalData, String propertyCode,
+            String newValue)
+    {
+        EntityPropertyPE property = findProperty(externalData, propertyCode);
+
+        removeProperty(externalData, property);
+        flushSession();
+
+        DataSetPropertyPE newProperty = new DataSetPropertyPE();
+        copyPropertyWithNewValue(newValue, property, newProperty);
+        addProperty(externalData, newProperty);
+        flushSession();
+    }
+
+    private void copyPropertyWithNewValue(String newValue, EntityPropertyPE oldProperty,
+            EntityPropertyPE newProperty)
+    {
+        newProperty.setEntityTypePropertyType(oldProperty.getEntityTypePropertyType());
+        newProperty.setRegistrator(oldProperty.getRegistrator());
+        newProperty.setValue(newValue);
+    }
+
+    private static <T extends EntityPropertyPE> void addProperty(
+            IEntityPropertiesHolder propertiesHolder, T newProperty)
+    {
+        Set<EntityPropertyPE> properties = getCopiedProperties(propertiesHolder);
+        properties.add(newProperty);
+        propertiesHolder.setProperties(properties);
+    }
+
+    private static Set<EntityPropertyPE> removeProperty(IEntityPropertiesHolder propertiesHolder,
+            EntityPropertyPE property)
+    {
+        Set<EntityPropertyPE> properties = getCopiedProperties(propertiesHolder);
+        boolean removed = properties.remove(property);
+        assert removed : "property could not be removed";
+        propertiesHolder.setProperties(properties);
+        return properties;
+    }
+
+    private static Set<EntityPropertyPE> getCopiedProperties(
+            IEntityPropertiesHolder propertiesHolder)
+    {
+        return new HashSet<EntityPropertyPE>(propertiesHolder.getProperties());
+    }
+
+    private static EntityPropertyPE findProperty(IEntityPropertiesHolder propertiesHolder,
+            String propertyCode)
+    {
+        for (EntityPropertyPE prop : propertiesHolder.getProperties())
+        {
+            if (prop.getEntityTypePropertyType().getPropertyType().getCode().equals(propertyCode))
+            {
+                return prop;
+            }
+        }
+        fail("property not found: " + propertyCode);
+        return null; // never happens
+    }
 
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/util/TestInitializer.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/util/TestInitializer.java
index 3cc9f7a9b70..e204e3135cb 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/util/TestInitializer.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/util/TestInitializer.java
@@ -16,7 +16,15 @@
 
 package ch.systemsx.cisd.openbis.generic.server.util;
 
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.io.FileUtils;
+
+import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked;
+import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.logging.LogInitializer;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.FullTextIndexerRunnable;
 
 /**
  * 
@@ -25,7 +33,8 @@ import ch.systemsx.cisd.common.logging.LogInitializer;
  */
 public class TestInitializer
 {
-    public static final String LUCENE_INDEX_PATH = "../openbis/sourceTest/lucene/indices";
+    public static final String LUCENE_INDEX_TEMPLATE_PATH = "./sourceTest/lucene/indices";
+    public static final String LUCENE_INDEX_PATH = "../openbis/targets/lucene/indices";
     
     public static void init()
     {
@@ -37,6 +46,29 @@ public class TestInitializer
         System.setProperty("hibernate.search.index-base", LUCENE_INDEX_PATH);
         System.setProperty("hibernate.search.worker.execution", "sync");
         System.setProperty("mass-upload-folder", "../openbis/sourceTest/sql/postgresql");
+
+        // make sure the search index is up-to-date
+        // and in the right place when we run tests
+        restoreSearchIndex();
     }
 
+    // create a fresh copy of the Lucene index
+    public static void restoreSearchIndex()
+    {
+        File targetPath = new File(TestInitializer.LUCENE_INDEX_PATH);
+        FileUtilities.deleteRecursively(targetPath);
+        targetPath.mkdirs();
+        File srcPath = new File(LUCENE_INDEX_TEMPLATE_PATH);
+        try
+        {
+            FileUtils.copyDirectory(srcPath, targetPath);
+            new File(srcPath, FullTextIndexerRunnable.FULL_TEXT_INDEX_MARKER_FILENAME)
+                    .createNewFile();
+        } catch (IOException ex)
+        {
+            throw new IOExceptionUnchecked(ex);
+        }
+    }
+
+
 }
-- 
GitLab