edu.stanford.slac.archiverappliance.PlainPB.PlainPBFileNameUtilityTest.java Source code

Java tutorial

Introduction

Here is the source code for edu.stanford.slac.archiverappliance.PlainPB.PlainPBFileNameUtilityTest.java

Source

/*******************************************************************************
 * Copyright (c) 2011 The Board of Trustees of the Leland Stanford Junior University
 * as Operator of the SLAC National Accelerator Laboratory.
 * Copyright (c) 2011 Brookhaven National Laboratory.
 * EPICS archiver appliance is distributed subject to a Software License Agreement found
 * in file LICENSE that is included with this distribution.
 *******************************************************************************/
package edu.stanford.slac.archiverappliance.PlainPB;

import static org.junit.Assert.assertTrue;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

import org.apache.commons.io.FileUtils;
import org.epics.archiverappliance.common.PartitionGranularity;
import org.epics.archiverappliance.common.TimeUtils;
import org.epics.archiverappliance.config.ConfigService;
import org.epics.archiverappliance.config.ConfigServiceForTests;
import org.epics.archiverappliance.utils.nio.ArchPaths;
import org.joda.time.DateTime;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import edu.stanford.slac.archiverappliance.PlainPB.PlainPBStoragePlugin.CompressionMode;

/**
 * Test the mapping of PVs to file/key names
 * @author mshankar
 *
 */
public class PlainPBFileNameUtilityTest {
    String fileName = ConfigServiceForTests.getDefaultPBTestFolder() + "/" + "PlainPBFileNameUtility/";
    String rootFolderStr = fileName;
    private ConfigService configService;

    @Before
    public void setUp() throws Exception {
        configService = new ConfigServiceForTests(new File("./bin"));
        File rootFolder = new File(rootFolderStr);
        if (rootFolder.exists()) {
            FileUtils.deleteDirectory(rootFolder);
        }

        rootFolder.mkdirs();
    }

    @After
    public void tearDown() throws Exception {
        File rootFolder = new File(rootFolderStr);
        FileUtils.deleteDirectory(rootFolder);
    }

    @Test
    public void testGetFilesWithDataOnAHourPartition() throws Exception {
        // Lets create some files that cater to this partition.
        long startOfYearEpochSeconds = TimeUtils.getStartOfCurrentYearInSeconds();
        String pvName = "First:Second:Third:HourPart_1";
        PartitionGranularity partitionHour = PartitionGranularity.PARTITION_HOUR;
        String extension = ".pb";
        for (int hours = 0; hours < 24; hours++) {
            mkPath(PlainPBPathNameUtility.getPathNameForTime(rootFolderStr, pvName,
                    (startOfYearEpochSeconds + hours * 3600), partitionHour, new ArchPaths(), CompressionMode.NONE,
                    configService.getPVNameToKeyConverter()));
        }

        Path[] matchingPaths = PlainPBPathNameUtility.getPathsWithData(new ArchPaths(), rootFolderStr, pvName,
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds, 0),
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600 - 1, 0), extension,
                partitionHour, CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + matchingPaths.length, matchingPaths.length == 4);

        Path[] etlPaths = PlainPBPathNameUtility.getPathsBeforeCurrentPartition(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600, 0), extension,
                partitionHour, CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + etlPaths.length, etlPaths.length == 4);

        File mostRecentFile = PlainPBPathNameUtility.getMostRecentPathBeforeTime(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600, 0), extension,
                partitionHour, CompressionMode.NONE, configService.getPVNameToKeyConverter()).toFile();
        assertTrue("Most recent file is null?", mostRecentFile != null);
        assertTrue("Unxpected most recent file " + mostRecentFile.getAbsolutePath(),
                mostRecentFile.getName().endsWith("03.pb"));
    }

    @Test
    public void testGetFilesWithDataOnADayPartition() throws Exception {
        // Lets create some files that cater to this partition.
        long startOfYearEpochSeconds = TimeUtils.getStartOfCurrentYearInSeconds();
        String pvName = "First:Second:Third:DayPart_1";
        PartitionGranularity partitionDay = PartitionGranularity.PARTITION_DAY;
        String extension = ".pb";
        for (int days = 0; days < 50; days++) {
            mkPath(PlainPBPathNameUtility.getPathNameForTime(rootFolderStr, pvName,
                    (startOfYearEpochSeconds + days * 24 * 3600), partitionDay, new ArchPaths(),
                    CompressionMode.NONE, configService.getPVNameToKeyConverter()));
        }

        Path[] matchingPaths = PlainPBPathNameUtility.getPathsWithData(new ArchPaths(), rootFolderStr, pvName,
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds, 0),
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 10 * 24 * 3600 - 1, 0), extension,
                partitionDay, CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + matchingPaths.length, matchingPaths.length == 10);

        Path[] etlPaths = PlainPBPathNameUtility.getPathsBeforeCurrentPartition(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 10 * 24 * 3600, 0), extension,
                partitionDay, CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + etlPaths.length, etlPaths.length == 10);

        // We have 50 days of data, ask for the 51st day here.
        File mostRecentFile = PlainPBPathNameUtility.getMostRecentPathBeforeTime(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 51 * 24 * 3600, 0), extension,
                partitionDay, CompressionMode.NONE, configService.getPVNameToKeyConverter()).toFile();
        assertTrue("Most recent file is null?", mostRecentFile != null);
        assertTrue("Unxpected most recent file " + mostRecentFile.getAbsolutePath(),
                mostRecentFile.getName().endsWith("19.pb"));

    }

    @Test
    public void testGetFilesWithDataOnAMonthPartition() throws Exception {
        // Lets create some files that cater to this partition.
        long startOfYearEpochSeconds = TimeUtils.getStartOfCurrentYearInSeconds();
        DateTime curr = new DateTime(startOfYearEpochSeconds * 1000);
        String pvName = "First:Second:Third:MonthPart_1";
        PartitionGranularity partition = PartitionGranularity.PARTITION_MONTH;
        String extension = ".pb";
        DateTime endMonth = null;
        for (int months = 1; months <= 12; months++) {
            mkPath(PlainPBPathNameUtility.getPathNameForTime(rootFolderStr, pvName, curr.getMillis() / 1000,
                    partition, new ArchPaths(), CompressionMode.NONE, configService.getPVNameToKeyConverter()));
            curr = curr.plusMonths(1);
            if (months == 4)
                endMonth = curr;
        }

        Path[] matchingPaths = PlainPBPathNameUtility.getPathsWithData(new ArchPaths(), rootFolderStr, pvName,
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds, 0),
                TimeUtils.convertFromEpochSeconds(endMonth.getMillis() / 1000 - 1, 0), extension, partition,
                CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + matchingPaths.length, matchingPaths.length == 4);

        Path[] etlPaths = PlainPBPathNameUtility.getPathsBeforeCurrentPartition(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(endMonth.getMillis() / 1000, 0), extension, partition,
                CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + etlPaths.length, etlPaths.length == 3);

        // Ask for the next year here; the last file written out is for Nov so expect 11.pb here
        File mostRecentFile = PlainPBPathNameUtility.getMostRecentPathBeforeTime(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds((curr.plusMonths(5).getMillis()) / 1000, 0), extension,
                partition, CompressionMode.NONE, configService.getPVNameToKeyConverter()).toFile();
        assertTrue("Most recent file is null?", mostRecentFile != null);
        assertTrue("Unxpected most recent file " + mostRecentFile.getAbsolutePath(),
                mostRecentFile.getName().endsWith("11.pb"));

    }

    @Test
    public void testGetFilesWithDataOnAYearlyPartition() throws Exception {
        // Lets create some files that cater to this partition.
        long startOfYearEpochSeconds = TimeUtils.getStartOfCurrentYearInSeconds();
        DateTime curr = new DateTime(startOfYearEpochSeconds * 1000);
        String pvName = "First:Second:Third:YearPart_1";
        PartitionGranularity partition = PartitionGranularity.PARTITION_YEAR;
        String extension = ".pb";
        DateTime endYear = null;
        for (int years = 0; years < 20; years++) {
            mkPath(PlainPBPathNameUtility.getPathNameForTime(rootFolderStr, pvName, curr.getMillis() / 1000,
                    partition, new ArchPaths(), CompressionMode.NONE, configService.getPVNameToKeyConverter()));
            curr = curr.plusYears(1);
            if (years == 7)
                endYear = curr;
        }

        Path[] matchingPaths = PlainPBPathNameUtility.getPathsWithData(new ArchPaths(), rootFolderStr, pvName,
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds, 0),
                TimeUtils.convertFromEpochSeconds(endYear.getMillis() / 1000 - 1, 0), extension, partition,
                CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + matchingPaths.length, matchingPaths.length == 8);

        Path[] etlPaths = PlainPBPathNameUtility.getPathsBeforeCurrentPartition(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(endYear.getMillis() / 1000, 0), extension, partition,
                CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + etlPaths.length, etlPaths.length == 8);

        // Ask for the next year here; the last file written out is for Nov so expect 11.pb here
        File mostRecentFile = PlainPBPathNameUtility.getMostRecentPathBeforeTime(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds((curr.plusYears(1).getMillis()) / 1000, 0), extension,
                partition, CompressionMode.NONE, configService.getPVNameToKeyConverter()).toFile();
        assertTrue("Most recent file is null?", mostRecentFile != null);
        assertTrue("Unxpected most recent file " + mostRecentFile.getAbsolutePath(),
                mostRecentFile.getName().endsWith(curr.getYear() + ".pb"));

        File mostRecentFile2 = PlainPBPathNameUtility.getMostRecentPathBeforeTime(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds((endYear.getMillis()) / 1000, 0), extension, partition,
                CompressionMode.NONE, configService.getPVNameToKeyConverter()).toFile();
        assertTrue("Most recent file is null?", mostRecentFile2 != null);
        String expectedEnd2 = endYear.getYear() + ".pb";
        assertTrue("Unxpected most recent file " + mostRecentFile2.getAbsolutePath() + " expecting " + expectedEnd2,
                mostRecentFile2.getName().endsWith(expectedEnd2));
    }

    @Test
    public void testGetFilesWithDataOnA5MinPartition() throws Exception {
        // Lets create some files that cater to this partition.
        long startOfYearEpochSeconds = TimeUtils.getStartOfCurrentYearInSeconds();
        String pvName = "First:Second:Third:Hour:5MinPart_1";
        PartitionGranularity partition5Min = PartitionGranularity.PARTITION_5MIN;
        String extension = ".pb";
        for (int mins = 0; mins < 24 * 60; mins += 5) {
            mkPath(PlainPBPathNameUtility.getPathNameForTime(rootFolderStr, pvName,
                    (startOfYearEpochSeconds + mins * 60), partition5Min, new ArchPaths(), CompressionMode.NONE,
                    configService.getPVNameToKeyConverter()));
        }

        Path[] matchingPaths = PlainPBPathNameUtility.getPathsWithData(new ArchPaths(), rootFolderStr, pvName,
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds, 0),
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600 - 1, 0), extension,
                partition5Min, CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + matchingPaths.length, matchingPaths.length == 4 * 12);

        Path[] etlPaths = PlainPBPathNameUtility.getPathsBeforeCurrentPartition(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600, 0), extension,
                partition5Min, CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + etlPaths.length, etlPaths.length == 4 * 12);

        File mostRecentFile = PlainPBPathNameUtility.getMostRecentPathBeforeTime(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600, 0), extension,
                partition5Min, CompressionMode.NONE, configService.getPVNameToKeyConverter()).toFile();
        assertTrue("Most recent file is null?", mostRecentFile != null);
        assertTrue("Unxpected most recent file " + mostRecentFile.getAbsolutePath(),
                mostRecentFile.getName().endsWith("03_55.pb"));
    }

    @Test
    public void testGetFilesWithDataOnA15MinPartition() throws Exception {
        // Lets create some files that cater to this partition.
        long startOfYearEpochSeconds = TimeUtils.getStartOfCurrentYearInSeconds();
        String pvName = "First:Second:Third:Hour:15MinPart_1";
        PartitionGranularity partition = PartitionGranularity.PARTITION_15MIN;
        String extension = ".pb";
        for (int mins = 0; mins < 24 * 60; mins += 5) {
            mkPath(PlainPBPathNameUtility.getPathNameForTime(rootFolderStr, pvName,
                    (startOfYearEpochSeconds + mins * 60), partition, new ArchPaths(), CompressionMode.NONE,
                    configService.getPVNameToKeyConverter()));
        }

        Path[] matchingPaths = PlainPBPathNameUtility.getPathsWithData(new ArchPaths(), rootFolderStr, pvName,
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds, 0),
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600 - 1, 0), extension, partition,
                CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + matchingPaths.length, matchingPaths.length == 4 * 4);

        Path[] etlPaths = PlainPBPathNameUtility.getPathsBeforeCurrentPartition(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600, 0), extension,
                partition, CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + etlPaths.length, etlPaths.length == 4 * 4);

        File mostRecentFile = PlainPBPathNameUtility.getMostRecentPathBeforeTime(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600, 0), extension,
                partition, CompressionMode.NONE, configService.getPVNameToKeyConverter()).toFile();
        assertTrue("Most recent file is null?", mostRecentFile != null);
        assertTrue("Unxpected most recent file " + mostRecentFile.getAbsolutePath(),
                mostRecentFile.getName().endsWith("03_45.pb"));
    }

    @Test
    public void testGetFilesWithDataOnA30MinPartition() throws Exception {
        // Lets create some files that cater to this partition.
        long startOfYearEpochSeconds = TimeUtils.getStartOfCurrentYearInSeconds();
        String pvName = "First:Second:Third:Hour:30MinPart_1";
        PartitionGranularity partition = PartitionGranularity.PARTITION_30MIN;
        String extension = ".pb";
        for (int mins = 0; mins < 24 * 60; mins += 5) {
            mkPath(PlainPBPathNameUtility.getPathNameForTime(rootFolderStr, pvName,
                    (startOfYearEpochSeconds + mins * 60), partition, new ArchPaths(), CompressionMode.NONE,
                    configService.getPVNameToKeyConverter()));
        }

        Path[] matchingPaths = PlainPBPathNameUtility.getPathsWithData(new ArchPaths(), rootFolderStr, pvName,
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds, 0),
                TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600 - 1, 0), extension, partition,
                CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + matchingPaths.length, matchingPaths.length == 4 * 2);

        Path[] etlPaths = PlainPBPathNameUtility.getPathsBeforeCurrentPartition(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600, 0), extension,
                partition, CompressionMode.NONE, configService.getPVNameToKeyConverter());
        assertTrue("File count " + etlPaths.length, etlPaths.length == 4 * 2);

        File mostRecentFile = PlainPBPathNameUtility.getMostRecentPathBeforeTime(new ArchPaths(), rootFolderStr,
                pvName, TimeUtils.convertFromEpochSeconds(startOfYearEpochSeconds + 4 * 3600, 0), extension,
                partition, CompressionMode.NONE, configService.getPVNameToKeyConverter()).toFile();
        assertTrue("Most recent file is null?", mostRecentFile != null);
        assertTrue("Unxpected most recent file " + mostRecentFile.getAbsolutePath(),
                mostRecentFile.getName().endsWith("03_30.pb"));
    }

    private static void mkPath(Path nf) throws IOException {
        if (!Files.exists(nf)) {
            Files.createDirectories(nf.getParent());
            Files.createFile(nf);
        }
    }
}