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

Java tutorial

Introduction

Here is the source code for edu.stanford.slac.archiverappliance.PlainPB.MultiFilePBEventStreamTest.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.sql.Timestamp;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.epics.archiverappliance.Event;
import org.epics.archiverappliance.EventStream;
import org.epics.archiverappliance.common.BasicContext;
import org.epics.archiverappliance.common.PartitionGranularity;
import org.epics.archiverappliance.common.TimeUtils;
import org.epics.archiverappliance.config.ArchDBRTypes;
import org.epics.archiverappliance.config.ConfigService;
import org.epics.archiverappliance.config.ConfigServiceForTests;
import org.epics.archiverappliance.data.ScalarValue;
import org.epics.archiverappliance.engine.membuf.ArrayListEventStream;
import org.epics.archiverappliance.retrieval.RemotableEventStreamDesc;
import org.epics.archiverappliance.retrieval.workers.CurrentThreadWorkerEventStream;
import org.epics.archiverappliance.utils.simulation.SimulationEvent;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Test EventStreams that span multiple PB files.
 * @author mshankar
 *
 */
public class MultiFilePBEventStreamTest {
    private static final Logger logger = Logger.getLogger(MultiFilePBEventStreamTest.class);
    String rootFolderName = ConfigServiceForTests.getDefaultPBTestFolder() + "/" + "MultiFilePBEventStream/";
    File rootFolder = new File(rootFolderName);

    @Before
    public void setUp() throws Exception {
        if (rootFolder.exists()) {
            FileUtils.deleteDirectory(rootFolder);
        }
        rootFolder.mkdirs();
    }

    @After
    public void tearDown() throws Exception {
        // FileUtils.deleteDirectory(rootFolder);
    }

    @Test
    public void testMultiFileEventStream() throws Exception {
        // We generate a years worth of data into a PlainPBStoragePlugin with different granularity. 
        // We then retrieve data and make sure that we get what we expect
        ConfigService configService = new ConfigServiceForTests(new File("./bin"));

        for (PartitionGranularity granularity : PartitionGranularity.values()) {
            logger.debug("Generating sample data for granularity " + granularity);

            String pvName = "MultiYear" + granularity.toString();
            String configURL = "pb://localhost?name=STS&rootFolder=" + rootFolderName + "&partitionGranularity="
                    + granularity.toString();
            PlainPBStoragePlugin pbplugin = new PlainPBStoragePlugin();
            pbplugin.initialize(configURL, configService);
            short currentYear = TimeUtils.getCurrentYear();
            ArchDBRTypes type = ArchDBRTypes.DBR_SCALAR_DOUBLE;
            try (BasicContext context = new BasicContext()) {
                for (int day = 0; day < 365; day++) {
                    ArrayListEventStream testData = new ArrayListEventStream(24 * 60 * 60,
                            new RemotableEventStreamDesc(type, pvName, currentYear));
                    int startofdayinseconds = day * 24 * 60 * 60;
                    for (int secondintoday = 0; secondintoday < 24 * 60 * 60; secondintoday++) {
                        testData.add(new SimulationEvent(startofdayinseconds + secondintoday, currentYear, type,
                                new ScalarValue<Double>((double) secondintoday)));
                    }
                    pbplugin.appendData(context, pvName, testData);
                }
            }
            logger.info("Done generating sample data for granularity " + granularity);
            Timestamp startTime = TimeUtils.convertFromISO8601String(currentYear + "-09-11T08:12:48.000Z");
            Timestamp endTime = TimeUtils.convertFromISO8601String(currentYear + "-10-04T22:53:31.000Z");
            long startEpochSeconds = TimeUtils.convertToEpochSeconds(startTime);
            long endEpochSeconds = TimeUtils.convertToEpochSeconds(endTime);
            long expectedEpochSeconds = startEpochSeconds - 1;
            try (BasicContext context = new BasicContext();
                    EventStream result = new CurrentThreadWorkerEventStream(pvName,
                            pbplugin.getDataForPV(context, pvName, startTime, endTime))) {
                long eventCount = 0;
                for (Event e : result) {
                    long currEpochSeconds = e.getEpochSeconds();
                    // The PlainPBStorage plugin will also yield the last event of the previous partition.
                    // We skip checking that as part of this test
                    if (currEpochSeconds < (startEpochSeconds - 1))
                        continue;
                    assertTrue("Expected " + TimeUtils
                            .convertToISO8601String(TimeUtils.convertFromEpochSeconds(expectedEpochSeconds, 0))
                            + " Got "
                            + TimeUtils
                                    .convertToISO8601String(TimeUtils.convertFromEpochSeconds(currEpochSeconds, 0))
                            + " at eventCount " + eventCount, currEpochSeconds == expectedEpochSeconds);
                    assertTrue("Less than "
                            + TimeUtils
                                    .convertToISO8601String(TimeUtils.convertFromEpochSeconds(endEpochSeconds, 0))
                            + " Got "
                            + TimeUtils
                                    .convertToISO8601String(TimeUtils.convertFromEpochSeconds(currEpochSeconds, 0))
                            + " at eventCount " + eventCount, currEpochSeconds <= endEpochSeconds);
                    expectedEpochSeconds++;
                    eventCount++;
                }
            }
        }
    }
}