From 0aed57d14d631ef50e55d46e9e64ba7c95fd350f Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Thu, 10 Feb 2011 15:43:50 +0000
Subject: [PATCH] LMS-1995 new test

SVN: 19886
---
 .../shared/utils/SegmentedStoreUtils.java     |  18 ++-
 .../shared/utils/SegmentedStoreUtilsTest.java | 134 +++++++++++++++++-
 2 files changed, 146 insertions(+), 6 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
index 6811824b748..35a18a3a586 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
@@ -29,7 +29,6 @@ import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.time.StopWatch;
 
 import ch.systemsx.cisd.base.utilities.OSUtilities;
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
@@ -40,6 +39,8 @@ import ch.systemsx.cisd.common.filesystem.IFreeSpaceProvider;
 import ch.systemsx.cisd.common.filesystem.rsync.RsyncCopier;
 import ch.systemsx.cisd.common.logging.ISimpleLogger;
 import ch.systemsx.cisd.common.logging.LogLevel;
+import ch.systemsx.cisd.common.utilities.ITimeProvider;
+import ch.systemsx.cisd.common.utilities.SystemTimeProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
@@ -146,6 +147,14 @@ public class SegmentedStoreUtils
     public static List<Share> getDataSetsPerShare(File storeRoot, String dataStoreCode,
             IFreeSpaceProvider freeSpaceProvider, IEncapsulatedOpenBISService service,
             ISimpleLogger log)
+    {
+        return getDataSetsPerShare(storeRoot, dataStoreCode, freeSpaceProvider, service, log,
+                SystemTimeProvider.SYSTEM_TIME_PROVIDER);
+    }
+
+    static List<Share> getDataSetsPerShare(File storeRoot, String dataStoreCode,
+            IFreeSpaceProvider freeSpaceProvider, IEncapsulatedOpenBISService service,
+            ISimpleLogger log, ITimeProvider timeProvider)
     {
         Map<String, Share> shares = new HashMap<String, Share>();
         for (File file : getImcomingShares(storeRoot))
@@ -165,13 +174,12 @@ public class SegmentedStoreUtils
                 {
                     if (dataSet.getDataSetSize() == null)
                     {
-                        StopWatch stopWatch = new StopWatch();
                         log.log(LogLevel.INFO, "Calculating size of " + dataSetInStore);
-                        stopWatch.start();
+                        long t0 = timeProvider.getTimeInMilliseconds();
                         long size = FileUtils.sizeOfDirectory(dataSetInStore);
-                        stopWatch.stop();
                         log.log(LogLevel.INFO, dataSetInStore + " contains " + size
-                                + " bytes (calculated in " + stopWatch.getTime() + " msec)");
+                                + " bytes (calculated in "
+                                + (timeProvider.getTimeInMilliseconds() - t0) + " msec)");
                         service.updateShareIdAndSize(dataSetCode, shareId, size);
                         dataSet.setDataSetSize(size);
                     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java
index 33e47299f33..435ed0641dc 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.dss.generic.shared.utils;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -29,8 +30,15 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
+import ch.systemsx.cisd.common.filesystem.HostAwareFile;
+import ch.systemsx.cisd.common.filesystem.IFreeSpaceProvider;
+import ch.systemsx.cisd.common.logging.ISimpleLogger;
+import ch.systemsx.cisd.common.logging.LogLevel;
+import ch.systemsx.cisd.common.test.RecordingMatcher;
+import ch.systemsx.cisd.common.utilities.ITimeProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
 
 /**
  * 
@@ -39,14 +47,51 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
  */
 public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase
 {
+    private static final class MockLogger implements ISimpleLogger
+    {
+        private final StringBuilder builder = new StringBuilder();
+        
+        public void log(LogLevel level, String message)
+        {
+            builder.append(level).append(": ").append(message).append('\n');
+        }
+
+        @Override
+        public String toString()
+        {
+            return builder.toString();
+        }
+    }
+    
+    private static final String DATA_STORE_CODE = "ds-code";
+    
     private Mockery context;
     private IEncapsulatedOpenBISService service;
+    private ISimpleLogger log;
+    private IFreeSpaceProvider freeSpaceProvider;
+    private ITimeProvider timeProvider;
+
+    private File store;
     
     @BeforeMethod
     public void beforeMethod()
     {
         context = new Mockery();
         service = context.mock(IEncapsulatedOpenBISService.class);
+        freeSpaceProvider = context.mock(IFreeSpaceProvider.class);
+        timeProvider = context.mock(ITimeProvider.class);
+        context.checking(new Expectations()
+            {
+                {
+                    allowing(timeProvider).getTimeInMilliseconds();
+                    will(returnValue(0L));
+                }
+            });
+        log = new MockLogger();
+        store = new File(workingDirectory, "store");
+        store.mkdirs();
+        new File(store, "blabla").mkdirs();
+        new File(store, "error").mkdirs();
     }
 
     @AfterMethod
@@ -54,9 +99,83 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase
     {
         context.assertIsSatisfied();
     }
+    
+    @Test
+    public void testGetDataSetsPerShare()
+    {
+        final File ds1File = new File(store, "1/uuid/01/02/03/ds-1");
+        ds1File.mkdirs();
+        FileUtilities.writeToFile(new File(ds1File, "read.me"), "nice work!");
+        final SimpleDataSetInformationDTO ds1 = dataSet(ds1File, DATA_STORE_CODE, null);
+        File ds2File = new File(store, "1/uuid/01/02/04/ds-2");
+        ds2File.mkdirs();
+        FileUtilities.writeToFile(new File(ds2File, "hello.txt"), "hello world");
+        final SimpleDataSetInformationDTO ds2 = dataSet(ds2File, "blabla", null);
+        File ds3File = new File(store, "2/uuid/01/05/04/ds-3");
+        ds3File.mkdirs();
+        FileUtilities.writeToFile(new File(ds3File, "hi.txt"), "hi everybody");
+        final SimpleDataSetInformationDTO ds3 = dataSet(ds3File, DATA_STORE_CODE, 123456789L);
+        File ds4File = new File(store, "1/uuid/0a/02/03/ds-4");
+        ds4File.mkdirs();
+        FileUtilities.writeToFile(new File(ds4File, "hello.data"), "hello data");
+        final SimpleDataSetInformationDTO ds4 = dataSet(ds4File, DATA_STORE_CODE, 42L);
+        final SimpleDataSetInformationDTO ds5 = new SimpleDataSetInformationDTO();
+        ds5.setDataSetCode("ds5");
+        ds5.setDataSetShareId("2");
+        ds5.setDataSetLocation("blabla");
+        ds5.setDataStoreCode(DATA_STORE_CODE);
+        final RecordingMatcher<HostAwareFile> fileMatcher = new RecordingMatcher<HostAwareFile>();
+        context.checking(new Expectations()
+            {
+                {
+                    one(service).listDataSets();
+                    will(returnValue(Arrays.asList(ds1, ds2, ds3, ds4, ds5)));
+                    
+                    one(service).updateShareIdAndSize("ds-1", "1", 10L);
+                    
+                    try
+                    {
+                        one(freeSpaceProvider).freeSpaceKb(with(fileMatcher));
+                        will(returnValue(12345L));
+                    } catch (IOException ex)
+                    {
+                        ex.printStackTrace();
+                    }
+                }
+            });
+        
+        List<Share> shares =
+                SegmentedStoreUtils.getDataSetsPerShare(store, DATA_STORE_CODE, freeSpaceProvider,
+                        service, log, timeProvider);
+        Share share1 = shares.get(0);
+        long freeSpace = share1.calculateFreeSpace();
+        
+        assertEquals("INFO: Calculating size of " + ds1File + "\n" + "INFO: " + ds1File
+                + " contains 10 bytes (calculated in 0 msec)\n"
+                + "WARN: Data set ds5 no longer exists in share 2.\n", log.toString());
+        assertEquals(new File(store, "1"), fileMatcher.recordedObject().getFile());
+        assertEquals(12345L * 1024, freeSpace);
+        assertEquals(new File(store, "1").toString(), share1.getShare().toString());
+        assertEquals("1", share1.getShareId());
+        assertSame(ds4, share1.getDataSetsOrderedBySize().get(0));
+        assertEquals(42L, share1.getDataSetsOrderedBySize().get(0).getDataSetSize().longValue());
+        assertSame(ds1, share1.getDataSetsOrderedBySize().get(1));
+        assertEquals(10L, share1.getDataSetsOrderedBySize().get(1).getDataSetSize().longValue());
+        assertEquals(2, share1.getDataSetsOrderedBySize().size());
+        assertEquals(52L, share1.getTotalSizeOfDataSets());
+        assertEquals(new File(store, "2").toString(), shares.get(1).getShare().toString());
+        assertEquals("2", shares.get(1).getShareId());
+        assertSame(ds3, shares.get(1).getDataSetsOrderedBySize().get(0));
+        assertEquals(123456789L, shares.get(1).getDataSetsOrderedBySize().get(0).getDataSetSize().longValue());
+        assertEquals(1, shares.get(1).getDataSetsOrderedBySize().size());
+        assertEquals(123456789L, shares.get(1).getTotalSizeOfDataSets());
+        assertEquals(2, shares.size());
+        
+        context.assertIsSatisfied();
+    }
 
     @Test
-    public void test()
+    public void testMoveDataSetToAnotherShare()
     {
         File share1 = new File(workingDirectory, "store/1");
         File share1uuid01 = new File(share1, "uuid/01");
@@ -105,4 +224,17 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase
         }
         assertEquals(Arrays.asList(names).toString(), actualNames.toString());
     }
+    
+    private SimpleDataSetInformationDTO dataSet(File dataSetFile, String dataStoreCode, Long size)
+    {
+        SimpleDataSetInformationDTO dataSet = new SimpleDataSetInformationDTO();
+        dataSet.setDataSetCode(dataSetFile.getName());
+        dataSet.setDataStoreCode(dataStoreCode);
+        String path = FileUtilities.getRelativeFile(store, dataSetFile);
+        int indexOfFirstSeparator = path.indexOf(File.separatorChar);
+        dataSet.setDataSetShareId(path.substring(0, indexOfFirstSeparator));
+        dataSet.setDataSetLocation(path.substring(indexOfFirstSeparator + 1));
+        dataSet.setDataSetSize(size);
+        return dataSet;
+    }
 }
-- 
GitLab