/* * JBoss, Home of Professional Open Source. * Copyright 2009, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.ejb3.timer.schedule; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; import javax.ejb.ScheduleExpression; import org.jboss.as.ejb3.timerservice.schedule.CalendarBasedTimeout; import org.jboss.logging.Logger; import org.junit.Assert; import org.junit.Test; /** * CalendarBasedTimeoutTestCase * * @author Brad Maxwell * @version $Revision: $ */ public class CalendarBasedTimeoutWithDifferentTimeZoneTestCase { /** * Logger */ private static Logger logger = Logger.getLogger(CalendarBasedTimeoutWithDifferentTimeZoneTestCase.class); /** * Construct a testcase for the timezone */ public CalendarBasedTimeoutWithDifferentTimeZoneTestCase() { } @Test public void testScheduledTimezoneDifferentThanCurrentSystem() { // This tests replicates an automatic timer below being deployed in a system whose default timezone is America/Chicago // @Schedule(persistent = false, timezone = "America/New_York", dayOfMonth = "*", dayOfWeek = "*", month = "*", hour = // "2", minute = "*", second = "0", year = "*") // The schedule for the timer is to fire every minute where the hour is 2 in the America/New_York timezone ScheduleExpression sch = new ScheduleExpression(); sch.timezone("America/New_York"); sch.dayOfMonth("*"); sch.dayOfWeek("*"); sch.month("*"); sch.hour("2"); sch.minute("*"); sch.second("0"); sch.year("*"); CalendarBasedTimeout calendarTimeout = new CalendarBasedTimeout(sch); Calendar firstTimeout = calendarTimeout.getFirstTimeout(); Assert.assertNotNull("first timeout is null", firstTimeout); logger.info("First timeout is " + firstTimeout.getTime()); // currentCal sets up a dummy time in the future, the timezone is America/Chicago in which this imaginary system is // running TimeZone currentTimezone = TimeZone.getTimeZone("America/Chicago"); Calendar currentCal = new GregorianCalendar(currentTimezone); currentCal.set(Calendar.YEAR, 2014); currentCal.set(Calendar.MONTH, 1); currentCal.set(Calendar.DATE, 8); currentCal.set(Calendar.HOUR_OF_DAY, 1); currentCal.set(Calendar.MINUTE, 1); currentCal.set(Calendar.SECOND, 1); currentCal.set(Calendar.MILLISECOND, 0); // https://issues.jboss.org/browse/WFLY-2840 - @Schedule EJB Timer not using timezone when calcualting next timeout // Next test WFLY-2840, by calling getNextTimeout with the dummy time above, the expected result is for the timer to // fire at 1:02:00 // If the bug is not fixed it will return 2:00:00 Calendar nextTimeout = calendarTimeout.getNextTimeout(currentCal); logger.info("Next timeout is " + nextTimeout.getTime()); Calendar expectedCal = new GregorianCalendar(currentTimezone); expectedCal.set(Calendar.YEAR, 2014); expectedCal.set(Calendar.MONTH, 1); expectedCal.set(Calendar.DATE, 8); expectedCal.set(Calendar.HOUR_OF_DAY, 1); expectedCal.set(Calendar.MINUTE, 2); expectedCal.set(Calendar.SECOND, 0); expectedCal.set(Calendar.MILLISECOND, 0); Assert.assertEquals("[WFLY-2840] Next timeout should be: " + expectedCal.getTime(), expectedCal.getTime(), nextTimeout.getTime()); } }