/******************************************************************************* * 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.PB.utils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.sql.Timestamp; import java.text.DecimalFormat; import java.util.LinkedList; import java.util.List; import org.apache.log4j.Logger; import org.epics.archiverappliance.common.PartitionGranularity; import org.epics.archiverappliance.common.TimeSpan; import org.epics.archiverappliance.common.TimeUtils; import org.epics.archiverappliance.common.YearSecondTimestamp; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Test TimeUtils. * @author mshankar * */ public class TimeUtilsTest { private static Logger logger = Logger.getLogger(TimeUtilsTest.class.getName()); private LinkedList<Timestamp> testcases = new LinkedList<Timestamp>(); @Before public void setUp() throws Exception { testcases.add(TimeUtils.now()); testcases.add(TimeUtils.convertFromISO8601String("2000-01-01T00:00:00.000Z")); testcases.add(TimeUtils.convertFromISO8601String("2000-02-01T00:00:00.000Z")); testcases.add(TimeUtils.convertFromISO8601String("2002-02-01T00:00:00.000Z")); testcases.add(TimeUtils.convertFromISO8601String("2003-12-21T08:33:55.003Z")); testcases.add(TimeUtils.convertFromISO8601String("2013-12-21T08:33:55.003Z")); testcases.add(TimeUtils.convertFromISO8601String("2004-02-29T08:33:55.003Z")); testcases.add(TimeUtils.convertFromISO8601String("2008-02-29T08:33:55.003Z")); testcases.add(TimeUtils.convertFromISO8601String("2012-02-29T08:33:55.003Z")); long startOfCurrentYearInSeconds = TimeUtils.getStartOfCurrentYearInSeconds(); for(int secondsintoYear = 0; secondsintoYear < 24*60*60*365; secondsintoYear+=323) { testcases.add(new Timestamp((startOfCurrentYearInSeconds+secondsintoYear)*1000)); } // 2008 was a leap year long startOf2008InSeconds = TimeUtils.getStartOfYearInSeconds(2008); for(int secondsintoYear = 0; secondsintoYear < 24*60*60*366; secondsintoYear+=656) { testcases.add(new Timestamp((startOf2008InSeconds+secondsintoYear)*1000)); } // Create some sample times for the rest of the millenium. DecimalFormat df = new DecimalFormat("0000"); for(int year = 1970; year < 2000; year++) { testcases.add(TimeUtils.convertFromISO8601String(df.format(year) + "-12-21T08:33:53.000Z")); } } @After public void tearDown() throws Exception { } @Test public void testConvertFromEpochSeconds() { for(Timestamp ts : testcases) { long epochSeconds = TimeUtils.convertToEpochSeconds(ts); int nanos = ts.getNanos(); Timestamp finalresult = TimeUtils.convertFromEpochSeconds(epochSeconds, nanos); assertEquals(ts, finalresult); } } @Test public void convertFromEpochMillis() { for(Timestamp ts : testcases) { // We can't really test the millis portion, however this is adequate for now long epochMilliSeconds = TimeUtils.convertToEpochMillis(ts); int nanos = ts.getNanos(); Timestamp finalresult = TimeUtils.convertFromEpochMillis(epochMilliSeconds); ts.setNanos(nanos); assertEquals(ts, finalresult); } } @Test public void testConvertFromJCATimeStamp() { for(Timestamp ts : testcases) { long epochSeconds = TimeUtils.convertToEpochSeconds(ts); int nanos = ts.getNanos(); gov.aps.jca.dbr.TimeStamp jcats = new gov.aps.jca.dbr.TimeStamp(epochSeconds - TimeUtils.EPICS_EPOCH_2_JAVA_EPOCH_OFFSET, nanos); Timestamp finalresult = TimeUtils.convertFromJCATimeStamp(jcats); assertEquals(ts, finalresult); } } @Test public void testConvertFromYearSecondTimestamp() { for(Timestamp ts : testcases) { YearSecondTimestamp yts = TimeUtils.convertToYearSecondTimestamp(ts); Timestamp finalresult = TimeUtils.convertFromYearSecondTimestamp(yts); assertEquals(ts, finalresult); } } @Test public void testConvertJCAToFromYearSecond() { for(Timestamp ts : testcases) { long epochSeconds = TimeUtils.convertToEpochSeconds(ts); int nanos = ts.getNanos(); gov.aps.jca.dbr.TimeStamp jcats = new gov.aps.jca.dbr.TimeStamp(epochSeconds - TimeUtils.EPICS_EPOCH_2_JAVA_EPOCH_OFFSET, nanos); YearSecondTimestamp yts = TimeUtils.convertToYearSecondTimestamp(jcats); Timestamp finalresult = TimeUtils.convertFromYearSecondTimestamp(yts); assertEquals(ts, finalresult); } } @Test public void testConvertEpochSecondsToFromYearSecond() { for(Timestamp ts : testcases) { long epochSeconds = TimeUtils.convertToEpochSeconds(ts); int nanos = ts.getNanos(); YearSecondTimestamp yts = TimeUtils.convertToYearSecondTimestamp(epochSeconds); yts.setNanos(nanos); Timestamp finalresult = TimeUtils.convertFromYearSecondTimestamp(yts); assertEquals(ts, finalresult); } } private static boolean compareTimeSpans(List<TimeSpan> spans, String isoformattedlist) { String[] times = isoformattedlist.split(","); if(times.length != spans.size()*2) { logger.warn("The string array has " + times.length + " elements and the time span list has " + spans.size() + " elements"); return false; } int currTimeIndex = 0; for(TimeSpan span : spans) { String expectedStartTime = times[currTimeIndex++]; String expectedEndTime = times[currTimeIndex++]; Timestamp expectedStartTS = TimeUtils.convertFromISO8601String(expectedStartTime); Timestamp expectedEndTS = TimeUtils.convertFromISO8601String(expectedEndTime); if(expectedStartTS.getTime() != span.getStartTime().getTime()) { logger.warn("Expected start of " + expectedStartTime + " obtained " + TimeUtils.convertToISO8601String(span.getStartTime())); return false; } if(expectedEndTS.getTime() != span.getEndTime().getTime()) { logger.warn("Expected end of " + expectedStartTime + " obtained " + TimeUtils.convertToISO8601String(span.getStartTime())); return false; } } if(currTimeIndex != times.length) { logger.warn("We are missing some expected values"); for(; currTimeIndex<times.length; currTimeIndex++) { logger.warn("We are missing value " + times[currTimeIndex++]); } return false; } return true; } @Test public void testbreakIntoYearlyTimeSpans() { assertTrue(compareTimeSpans( TimeUtils.breakIntoYearlyTimeSpans(TimeUtils.convertFromISO8601String("2011-02-01T08:00:00.000Z"), TimeUtils.convertFromISO8601String("2011-02-02T08:00:00.000Z")), "2011-02-01T08:00:00.000Z" + "," + "2011-02-02T08:00:00.000Z" )); assertTrue(compareTimeSpans( TimeUtils.breakIntoYearlyTimeSpans(TimeUtils.convertFromISO8601String("2000-01-01T00:00:00.000Z"), TimeUtils.convertFromISO8601String("2000-01-01T00:00:00.000Z")), "2000-01-01T00:00:00.000Z" + "," + "2000-01-01T00:00:00.000Z" )); assertTrue(compareTimeSpans( TimeUtils.breakIntoYearlyTimeSpans(TimeUtils.convertFromISO8601String("2001-02-01T00:00:00.000Z"), TimeUtils.convertFromISO8601String("2002-02-01T00:00:00.000Z")), "2001-02-01T00:00:00.000Z" + "," + "2001-12-31T23:59:59.999Z" + "," + "2002-01-01T00:00:00.000Z" + "," + "2002-02-01T00:00:00.000Z" )); assertTrue(compareTimeSpans( TimeUtils.breakIntoYearlyTimeSpans(TimeUtils.convertFromISO8601String("2001-02-01T00:00:00.000Z"), TimeUtils.convertFromISO8601String("2002-01-01T00:00:00.000Z")), "2001-02-01T00:00:00.000Z" + "," + "2001-12-31T23:59:59.999Z" + "," + "2002-01-01T00:00:00.000Z" + "," + "2002-01-01T00:00:00.000Z" )); assertTrue(compareTimeSpans( TimeUtils.breakIntoYearlyTimeSpans(TimeUtils.convertFromISO8601String("2001-12-31T23:59:59.998Z"), TimeUtils.convertFromISO8601String("2002-01-01T00:00:00.000Z")), "2001-12-31T23:59:59.998Z" + "," + "2001-12-31T23:59:59.999Z" + "," + "2002-01-01T00:00:00.000Z" + "," + "2002-01-01T00:00:00.000Z" )); assertTrue(compareTimeSpans( TimeUtils.breakIntoYearlyTimeSpans(TimeUtils.convertFromISO8601String("2001-12-31T00:00:00.000Z"), TimeUtils.convertFromISO8601String("2003-02-01T00:00:00.000Z")), "2001-12-31T00:00:00.000Z" + "," + "2001-12-31T23:59:59.999Z" + "," + "2002-01-01T00:00:00.000Z" + "," + "2002-12-31T23:59:59.999Z" + "," + "2003-01-01T00:00:00.000Z" + "," + "2003-02-01T00:00:00.000Z" )); assertTrue(compareTimeSpans( TimeUtils.breakIntoYearlyTimeSpans(TimeUtils.convertFromISO8601String("2001-12-31T00:00:00.000Z"), TimeUtils.convertFromISO8601String("2004-02-01T00:00:00.000Z")), "2001-12-31T00:00:00.000Z" + "," + "2001-12-31T23:59:59.999Z" + "," + "2002-01-01T00:00:00.000Z" + "," + "2002-12-31T23:59:59.999Z" + "," + "2003-01-01T00:00:00.000Z" + "," + "2003-12-31T23:59:59.999Z" + "," + "2004-01-01T00:00:00.000Z" + "," + "2004-02-01T00:00:00.000Z" )); assertTrue(compareTimeSpans( TimeUtils.breakIntoYearlyTimeSpans(TimeUtils.convertFromISO8601String("2010-06-27T08:00:00.000Z"), TimeUtils.convertFromISO8601String("2020-06-27T08:00:00.000Z")), "2010-06-27T08:00:00.000Z" + "," + "2010-12-31T23:59:59.999Z" + "," + "2011-01-01T00:00:00.000Z" + "," + "2011-12-31T23:59:59.999Z" + "," + "2012-01-01T00:00:00.000Z" + "," + "2012-12-31T23:59:59.999Z" + "," + "2013-01-01T00:00:00.000Z" + "," + "2013-12-31T23:59:59.999Z" + "," + "2014-01-01T00:00:00.000Z" + "," + "2014-12-31T23:59:59.999Z" + "," + "2015-01-01T00:00:00.000Z" + "," + "2015-12-31T23:59:59.999Z" + "," + "2016-01-01T00:00:00.000Z" + "," + "2016-12-31T23:59:59.999Z" + "," + "2017-01-01T00:00:00.000Z" + "," + "2017-12-31T23:59:59.999Z" + "," + "2018-01-01T00:00:00.000Z" + "," + "2018-12-31T23:59:59.999Z" + "," + "2019-01-01T00:00:00.000Z" + "," + "2019-12-31T23:59:59.999Z" + "," + "2020-01-01T00:00:00.000Z" + "," + "2020-06-27T08:00:00.000Z" )); } @Test public void testgetPartitionName() { assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2011-01-01T00:00:00.000Z")), PartitionGranularity.PARTITION_YEAR), "2011"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2012-02-29T12:24:26.000Z")), PartitionGranularity.PARTITION_YEAR), "2012"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2022-12-31T21:22:59.000Z")), PartitionGranularity.PARTITION_YEAR), "2022"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2011-01-01T00:00:00.000Z")), PartitionGranularity.PARTITION_MONTH), "2011_01"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2012-02-29T12:24:26.000Z")), PartitionGranularity.PARTITION_MONTH), "2012_02"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2013-03-31T23:59:59.000Z")), PartitionGranularity.PARTITION_MONTH), "2013_03"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2022-12-31T21:22:59.000Z")), PartitionGranularity.PARTITION_MONTH), "2022_12"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2011-01-01T00:00:00.000Z")), PartitionGranularity.PARTITION_DAY), "2011_01_01"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2012-02-29T12:24:26.000Z")), PartitionGranularity.PARTITION_DAY), "2012_02_29"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2013-03-31T23:59:59.000Z")), PartitionGranularity.PARTITION_DAY), "2013_03_31"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2022-12-31T21:22:59.000Z")), PartitionGranularity.PARTITION_DAY), "2022_12_31"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2011-01-01T00:00:00.000Z")), PartitionGranularity.PARTITION_HOUR), "2011_01_01_00"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2012-02-29T12:24:26.000Z")), PartitionGranularity.PARTITION_HOUR), "2012_02_29_12"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2013-03-31T23:59:59.000Z")), PartitionGranularity.PARTITION_HOUR), "2013_03_31_23"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2022-12-31T21:22:59.000Z")), PartitionGranularity.PARTITION_HOUR), "2022_12_31_21"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2011-01-01T00:00:00.000Z")), PartitionGranularity.PARTITION_5MIN), "2011_01_01_00_00"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2012-02-29T12:24:26.000Z")), PartitionGranularity.PARTITION_5MIN), "2012_02_29_12_20"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2013-03-31T23:59:59.000Z")), PartitionGranularity.PARTITION_5MIN), "2013_03_31_23_55"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2022-12-31T21:22:59.000Z")), PartitionGranularity.PARTITION_5MIN), "2022_12_31_21_20"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2011-01-01T00:00:00.000Z")), PartitionGranularity.PARTITION_15MIN), "2011_01_01_00_00"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2012-02-29T12:24:26.000Z")), PartitionGranularity.PARTITION_15MIN), "2012_02_29_12_15"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2013-03-31T23:59:59.000Z")), PartitionGranularity.PARTITION_15MIN), "2013_03_31_23_45"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2022-12-31T21:22:59.000Z")), PartitionGranularity.PARTITION_15MIN), "2022_12_31_21_15"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2011-01-01T00:00:00.000Z")), PartitionGranularity.PARTITION_30MIN), "2011_01_01_00_00"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2012-02-29T12:24:26.000Z")), PartitionGranularity.PARTITION_30MIN), "2012_02_29_12_00"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2013-03-31T23:59:59.000Z")), PartitionGranularity.PARTITION_30MIN), "2013_03_31_23_30"); assertEquals(TimeUtils.getPartitionName(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String("2022-12-31T21:22:59.000Z")), PartitionGranularity.PARTITION_30MIN), "2022_12_31_21_00"); } static private void testNextEquals(String tsstr, PartitionGranularity granularity, String expectedStr) { assertEquals( TimeUtils.convertToISO8601String(TimeUtils.getNextPartitionFirstSecond(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String(tsstr)), granularity)), expectedStr ); } @Test public void testGetNextPartitionFirstSecond() { testNextEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_YEAR, "2011-01-01T00:00:00.000Z"); testNextEquals("2010-02-12T12:23:59.000Z", PartitionGranularity.PARTITION_YEAR, "2011-01-01T00:00:00.000Z"); testNextEquals("2010-12-31T23:59:59.999Z", PartitionGranularity.PARTITION_YEAR,"2011-01-01T00:00:00.000Z"); testNextEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_MONTH,"2010-02-01T00:00:00.000Z"); testNextEquals("2010-01-15T00:00:00.000Z", PartitionGranularity.PARTITION_MONTH,"2010-02-01T00:00:00.000Z"); testNextEquals("2010-01-31T23:59:59.999Z", PartitionGranularity.PARTITION_MONTH,"2010-02-01T00:00:00.000Z"); testNextEquals("2010-02-01T00:00:00.000Z", PartitionGranularity.PARTITION_MONTH,"2010-03-01T00:00:00.000Z"); testNextEquals("2012-02-29T23:59:59.999Z", PartitionGranularity.PARTITION_MONTH,"2012-03-01T00:00:00.000Z"); testNextEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_DAY,"2010-01-02T00:00:00.000Z"); testNextEquals("2010-01-15T13:23:33.000Z", PartitionGranularity.PARTITION_DAY,"2010-01-16T00:00:00.000Z"); testNextEquals("2012-02-29T23:59:59.999Z", PartitionGranularity.PARTITION_DAY,"2012-03-01T00:00:00.000Z"); testNextEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_HOUR,"2010-01-01T01:00:00.000Z"); testNextEquals("2010-01-01T23:59:59.999Z", PartitionGranularity.PARTITION_HOUR,"2010-01-02T00:00:00.000Z"); testNextEquals("2011-02-28T23:59:59.999Z", PartitionGranularity.PARTITION_HOUR,"2011-03-01T00:00:00.000Z"); testNextEquals("2012-02-29T23:59:59.999Z", PartitionGranularity.PARTITION_HOUR,"2012-03-01T00:00:00.000Z"); testNextEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_5MIN,"2010-01-01T00:05:00.000Z"); testNextEquals("2010-03-17T22:17:44.000Z", PartitionGranularity.PARTITION_5MIN,"2010-03-17T22:20:00.000Z"); testNextEquals("2010-03-17T22:56:44.000Z", PartitionGranularity.PARTITION_5MIN,"2010-03-17T23:00:00.000Z"); testNextEquals("2010-01-01T23:59:59.999Z", PartitionGranularity.PARTITION_5MIN,"2010-01-02T00:00:00.000Z"); testNextEquals("2011-02-28T23:59:59.999Z", PartitionGranularity.PARTITION_5MIN,"2011-03-01T00:00:00.000Z"); testNextEquals("2012-02-29T23:59:59.999Z", PartitionGranularity.PARTITION_5MIN,"2012-03-01T00:00:00.000Z"); testNextEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_15MIN,"2010-01-01T00:15:00.000Z"); testNextEquals("2010-03-17T22:17:44.000Z", PartitionGranularity.PARTITION_15MIN,"2010-03-17T22:30:00.000Z"); testNextEquals("2010-03-17T22:56:44.000Z", PartitionGranularity.PARTITION_15MIN,"2010-03-17T23:00:00.000Z"); testNextEquals("2010-01-01T23:59:59.999Z", PartitionGranularity.PARTITION_15MIN,"2010-01-02T00:00:00.000Z"); testNextEquals("2011-02-28T23:59:59.999Z", PartitionGranularity.PARTITION_15MIN,"2011-03-01T00:00:00.000Z"); testNextEquals("2012-02-29T23:59:59.999Z", PartitionGranularity.PARTITION_15MIN,"2012-03-01T00:00:00.000Z"); testNextEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_30MIN,"2010-01-01T00:30:00.000Z"); testNextEquals("2010-03-17T22:17:44.000Z", PartitionGranularity.PARTITION_30MIN,"2010-03-17T22:30:00.000Z"); testNextEquals("2010-03-17T22:56:44.000Z", PartitionGranularity.PARTITION_30MIN,"2010-03-17T23:00:00.000Z"); testNextEquals("2010-01-01T23:59:59.999Z", PartitionGranularity.PARTITION_30MIN,"2010-01-02T00:00:00.000Z"); testNextEquals("2011-02-28T23:59:59.999Z", PartitionGranularity.PARTITION_30MIN,"2011-03-01T00:00:00.000Z"); testNextEquals("2012-02-29T23:59:59.999Z", PartitionGranularity.PARTITION_30MIN,"2012-03-01T00:00:00.000Z"); } static private void testPrevEquals(String tsstr, PartitionGranularity granularity, String expectedStr) { assertEquals( TimeUtils.convertToISO8601String(TimeUtils.getPreviousPartitionLastSecond(TimeUtils.convertToEpochSeconds(TimeUtils.convertFromISO8601String(tsstr)), granularity)), expectedStr ); } @Test public void testPreviousPartitionLastSecond() { testPrevEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_YEAR,"2009-12-31T23:59:59.000Z"); testPrevEquals("2010-06-30T12:23:43.000Z", PartitionGranularity.PARTITION_YEAR,"2009-12-31T23:59:59.000Z"); testPrevEquals("2010-12-31T23:59:59.000Z", PartitionGranularity.PARTITION_YEAR,"2009-12-31T23:59:59.000Z"); testPrevEquals("2012-02-29T23:59:59.999Z", PartitionGranularity.PARTITION_YEAR,"2011-12-31T23:59:59.000Z"); testPrevEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_MONTH,"2009-12-31T23:59:59.000Z"); testPrevEquals("2010-02-01T00:00:00.000Z", PartitionGranularity.PARTITION_MONTH,"2010-01-31T23:59:59.000Z"); testPrevEquals("2010-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_MONTH,"2010-02-28T23:59:59.000Z"); testPrevEquals("2012-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_MONTH,"2012-02-29T23:59:59.000Z"); testPrevEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_DAY,"2009-12-31T23:59:59.000Z"); testPrevEquals("2010-02-01T09:10:11.000Z", PartitionGranularity.PARTITION_DAY,"2010-01-31T23:59:59.000Z"); testPrevEquals("2010-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_DAY,"2010-02-28T23:59:59.000Z"); testPrevEquals("2012-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_DAY,"2012-02-29T23:59:59.000Z"); testPrevEquals("2010-01-01T01:00:00.000Z", PartitionGranularity.PARTITION_HOUR,"2010-01-01T00:59:59.000Z"); testPrevEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_HOUR,"2009-12-31T23:59:59.000Z"); testPrevEquals("2010-02-01T00:00:00.000Z", PartitionGranularity.PARTITION_HOUR,"2010-01-31T23:59:59.000Z"); testPrevEquals("2010-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_HOUR,"2010-02-28T23:59:59.000Z"); testPrevEquals("2012-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_HOUR,"2012-02-29T23:59:59.000Z"); testPrevEquals("2010-10-12T18:45:45.000Z", PartitionGranularity.PARTITION_5MIN,"2010-10-12T18:44:59.000Z"); testPrevEquals("2010-10-12T18:44:45.000Z", PartitionGranularity.PARTITION_5MIN,"2010-10-12T18:39:59.000Z"); testPrevEquals("2010-01-01T01:00:00.000Z", PartitionGranularity.PARTITION_5MIN,"2010-01-01T00:59:59.000Z"); testPrevEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_5MIN,"2009-12-31T23:59:59.000Z"); testPrevEquals("2010-02-01T00:00:00.000Z", PartitionGranularity.PARTITION_5MIN,"2010-01-31T23:59:59.000Z"); testPrevEquals("2010-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_5MIN,"2010-02-28T23:59:59.000Z"); testPrevEquals("2012-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_5MIN,"2012-02-29T23:59:59.000Z"); testPrevEquals("2010-10-12T18:45:45.000Z", PartitionGranularity.PARTITION_15MIN,"2010-10-12T18:44:59.000Z"); testPrevEquals("2010-10-12T18:44:45.000Z", PartitionGranularity.PARTITION_15MIN,"2010-10-12T18:29:59.000Z"); testPrevEquals("2010-01-01T01:00:00.000Z", PartitionGranularity.PARTITION_15MIN,"2010-01-01T00:59:59.000Z"); testPrevEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_15MIN,"2009-12-31T23:59:59.000Z"); testPrevEquals("2010-02-01T00:00:00.000Z", PartitionGranularity.PARTITION_15MIN,"2010-01-31T23:59:59.000Z"); testPrevEquals("2010-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_15MIN,"2010-02-28T23:59:59.000Z"); testPrevEquals("2012-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_15MIN,"2012-02-29T23:59:59.000Z"); testPrevEquals("2010-10-12T18:45:45.000Z", PartitionGranularity.PARTITION_30MIN,"2010-10-12T18:29:59.000Z"); testPrevEquals("2010-10-12T18:44:45.000Z", PartitionGranularity.PARTITION_30MIN,"2010-10-12T18:29:59.000Z"); testPrevEquals("2010-01-01T01:00:00.000Z", PartitionGranularity.PARTITION_30MIN,"2010-01-01T00:59:59.000Z"); testPrevEquals("2010-01-01T00:00:00.000Z", PartitionGranularity.PARTITION_30MIN,"2009-12-31T23:59:59.000Z"); testPrevEquals("2010-02-01T00:00:00.000Z", PartitionGranularity.PARTITION_30MIN,"2010-01-31T23:59:59.000Z"); testPrevEquals("2010-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_30MIN,"2010-02-28T23:59:59.000Z"); testPrevEquals("2012-03-01T00:00:00.000Z", PartitionGranularity.PARTITION_30MIN,"2012-02-29T23:59:59.000Z"); } @Test public void testconvertToTenthsOfASecond() throws Exception { long currentEpochSeconds = TimeUtils.getCurrentEpochSeconds(); assertEquals(TimeUtils.convertToTenthsOfASecond(currentEpochSeconds, 0), currentEpochSeconds*10); assertEquals(TimeUtils.convertToTenthsOfASecond(currentEpochSeconds, 100000000), currentEpochSeconds*10 + 1); assertEquals(TimeUtils.convertToTenthsOfASecond(currentEpochSeconds, 2*(100000000)), currentEpochSeconds*10 + 2); assertEquals(TimeUtils.convertToTenthsOfASecond(currentEpochSeconds, 9*(100000000)), currentEpochSeconds*10 + 9); try { TimeUtils.convertToTenthsOfASecond(currentEpochSeconds, 1999999999); fail("We should have been thrown an exception here"); } catch(NumberFormatException ex) { } for(int i = 0; i < 100000; i++) { Timestamp ts = TimeUtils.now(); TimeUtils.convertToTenthsOfASecond(ts.getTime()/1000, ts.getNanos()); } } /** * Test the method that breaks down a start time and end time into interval sizes * @throws Exception */ @Test public void testStartEndIntervalBreakDown() throws Exception { testStartEndIntervalBreakDown(TimeUtils.convertFromISO8601String("2011-02-01T08:00:00.000Z"), TimeUtils.convertFromISO8601String("2012-02-01T08:00:00.000Z"), 60*60*24*30, 13); testStartEndIntervalBreakDown(TimeUtils.convertFromISO8601String("2011-02-25T00:00:00.000Z"), TimeUtils.convertFromISO8601String("2012-02-01T08:00:00.000Z"), 60*60*24*30, 12); testStartEndIntervalBreakDown(TimeUtils.convertFromISO8601String("2011-02-01T08:00:00.000Z"), TimeUtils.convertFromISO8601String("2012-01-21T00:00:00.000Z"), 60*60*24*30, 12); } private void testStartEndIntervalBreakDown(Timestamp start, Timestamp end, long binInterval, int expectedBins) throws Exception { logger.debug("Testing interval breakdown for retrieval"); List<TimeSpan> intervals = TimeUtils.breakIntoIntervals(start, end, binInterval); assertTrue("Expecting " + expectedBins + " bins, got " + intervals.size(), intervals.size() == expectedBins); Timestamp previousEnd = null; for(int i = 0; i < intervals.size(); i++) { TimeSpan currentInterval = intervals.get(i); assertTrue("Expecting end greater than start" + TimeUtils.convertToHumanReadableString(currentInterval.getStartTime()) + " - " + TimeUtils.convertToHumanReadableString(currentInterval.getEndTime()), currentInterval.getEndTime().after(currentInterval.getStartTime())); logger.debug(TimeUtils.convertToISO8601String(currentInterval.getStartTime()) + " - " + TimeUtils.convertToISO8601String(currentInterval.getEndTime())); if(i == 0) { assertTrue("Expecting start at the beginning " + i, currentInterval.getStartTime().equals(start)); } if(i == intervals.size() - 1) { assertTrue("Expecting end at the end " + i, currentInterval.getEndTime().equals(end)); } if(previousEnd != null) { assertTrue("Expecting at most a one second difference between " + TimeUtils.convertToHumanReadableString(previousEnd) + " - " + TimeUtils.convertToHumanReadableString(currentInterval.getStartTime()) + " = " + (TimeUtils.convertToEpochSeconds(currentInterval.getStartTime()) - TimeUtils.convertToEpochSeconds(previousEnd)), (TimeUtils.convertToEpochSeconds(currentInterval.getStartTime()) - TimeUtils.convertToEpochSeconds(previousEnd) == 1)); assertTrue("Expecting non overlapping spans " + TimeUtils.convertToHumanReadableString(previousEnd) + " / " + TimeUtils.convertToHumanReadableString(currentInterval.getStartTime()), TimeUtils.convertToEpochSeconds(currentInterval.getStartTime()) > TimeUtils.convertToEpochSeconds(previousEnd)); } previousEnd = currentInterval.getEndTime(); } } }