/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.process.core.timer; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import org.jbpm.test.util.AbstractBaseTest; import org.junit.Test; import org.slf4j.LoggerFactory; public class DateTimeUtilsTest extends AbstractBaseTest { private static final long MINUTE_IN_MILLISECONDS = 60 * 1000L; private static final long FIFTY_NINE_SECONDS_IN_MILLISECONDS = 59 * 1000L; private static final long HOUR_IN_MILLISECONDS = 60 * 60 * 1000L; public void addLogger() { logger = LoggerFactory.getLogger(this.getClass()); } @Test public void testParseDateTime() { OffsetDateTime hourAfterEpoch = OffsetDateTime.of(1970, 1, 1, 1, 0, 0, 0, ZoneOffset.UTC); long parsedMilliseconds = DateTimeUtils.parseDateTime(hourAfterEpoch.format(DateTimeFormatter.ISO_DATE_TIME)); assertEquals(HOUR_IN_MILLISECONDS, parsedMilliseconds); } @Test public void testParseDuration() { long parsedMilliseconds = DateTimeUtils.parseDuration("1h"); assertEquals(HOUR_IN_MILLISECONDS, parsedMilliseconds); } @Test public void testParseDurationPeriodFormat() { long parsedMilliseconds = DateTimeUtils.parseDuration("PT1H"); assertEquals(HOUR_IN_MILLISECONDS, parsedMilliseconds); } @Test public void testParseDurationDefaultMilliseconds() { long parsedMilliseconds = DateTimeUtils.parseDuration(Long.toString(HOUR_IN_MILLISECONDS)); assertEquals(HOUR_IN_MILLISECONDS, parsedMilliseconds); } @Test public void testParseDateAsDuration() { OffsetDateTime oneMinuteFromNow = OffsetDateTime.now().plusMinutes(1); long parsedMilliseconds = DateTimeUtils.parseDateAsDuration(oneMinuteFromNow.format(DateTimeFormatter.ISO_DATE_TIME)); assertTrue("Parsed date as duration is bigger than " + MINUTE_IN_MILLISECONDS, parsedMilliseconds <= MINUTE_IN_MILLISECONDS); assertTrue("Parsed date as duration is too low! Expected value is between " + MINUTE_IN_MILLISECONDS + " and " + FIFTY_NINE_SECONDS_IN_MILLISECONDS + " but is " + parsedMilliseconds, parsedMilliseconds > FIFTY_NINE_SECONDS_IN_MILLISECONDS); } @Test public void testParseRepeatableStartEndDateTime() { OffsetDateTime oneMinuteFromNow = OffsetDateTime.now().plusMinutes(1); OffsetDateTime twoMinutesFromNow = oneMinuteFromNow.plusMinutes(1); String oneMinuteFromNowFormatted = oneMinuteFromNow.format(DateTimeFormatter.ISO_DATE_TIME); String twoMinutesFromNowFormatted = twoMinutesFromNow.format(DateTimeFormatter.ISO_DATE_TIME); String isoString = "R5/" + oneMinuteFromNowFormatted + "/" + twoMinutesFromNowFormatted; long[] parsedRepeatable = DateTimeUtils.parseRepeatableDateTime(isoString); assertEquals(5L, parsedRepeatable[0]); assertTrue("Parsed delay is bigger than " + MINUTE_IN_MILLISECONDS, parsedRepeatable[1] <= MINUTE_IN_MILLISECONDS); assertTrue("Parsed delay is too low! Expected value is between " + MINUTE_IN_MILLISECONDS + " and " + FIFTY_NINE_SECONDS_IN_MILLISECONDS + " but is " + parsedRepeatable[1], parsedRepeatable[1] > FIFTY_NINE_SECONDS_IN_MILLISECONDS); assertEquals("Parsed period should be one minute in milliseconds but is " + parsedRepeatable[2], MINUTE_IN_MILLISECONDS, parsedRepeatable[2]); } @Test public void testParseRepeatableStartDateTimeAndPeriod() { OffsetDateTime oneMinuteFromNow = OffsetDateTime.now().plusMinutes(1); String oneMinuteFromNowFormatted = oneMinuteFromNow.format(DateTimeFormatter.ISO_DATE_TIME); String isoString = "R5/" + oneMinuteFromNowFormatted + "/PT1M"; long[] parsedRepeatable = DateTimeUtils.parseRepeatableDateTime(isoString); assertEquals(5L, parsedRepeatable[0]); assertTrue("Parsed delay is bigger than " + MINUTE_IN_MILLISECONDS, parsedRepeatable[1] <= MINUTE_IN_MILLISECONDS); assertTrue("Parsed delay is too low! Expected value is between " + MINUTE_IN_MILLISECONDS + " and " + FIFTY_NINE_SECONDS_IN_MILLISECONDS + " but is " + parsedRepeatable[1], parsedRepeatable[1] > FIFTY_NINE_SECONDS_IN_MILLISECONDS); assertEquals("Parsed period should be one minute in milliseconds but is " + parsedRepeatable[2], MINUTE_IN_MILLISECONDS, parsedRepeatable[2]); } @Test public void testParseRepeatablePeriodAndEndDateTime() { OffsetDateTime twoMinutesFromNow = OffsetDateTime.now().plusMinutes(2); String twoMinutesFromNowFormatted = twoMinutesFromNow.format(DateTimeFormatter.ISO_DATE_TIME); String isoString = "R5/PT1M/" + twoMinutesFromNowFormatted; long[] parsedRepeatable = DateTimeUtils.parseRepeatableDateTime(isoString); assertEquals(5L, parsedRepeatable[0]); assertTrue("Parsed delay is bigger than " + MINUTE_IN_MILLISECONDS, parsedRepeatable[1] <= MINUTE_IN_MILLISECONDS); assertTrue("Parsed delay is too low! Expected value is between " + MINUTE_IN_MILLISECONDS + " and " + FIFTY_NINE_SECONDS_IN_MILLISECONDS + " but is " + parsedRepeatable[1], parsedRepeatable[1] > FIFTY_NINE_SECONDS_IN_MILLISECONDS); assertEquals("Parsed period should be one minute in milliseconds but is " + parsedRepeatable[2], MINUTE_IN_MILLISECONDS, parsedRepeatable[2]); } @Test public void testParseRepeatablePeriodOnly() { String isoString = "R/PT1M"; long[] parsedRepeatable = DateTimeUtils.parseRepeatableDateTime(isoString); assertEquals(-1L, parsedRepeatable[0]); // Default delay time is 1000ms assertEquals(1000L, parsedRepeatable[1]); assertEquals("Parsed period should be one minute in milliseconds but is " + parsedRepeatable[2], MINUTE_IN_MILLISECONDS, parsedRepeatable[2]); } }