/* * JBoss, Home of Professional Open Source. * Copyright 2008, 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.test.jmx.compliance.timer; import java.util.ArrayList; import java.util.Date; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; import javax.management.Notification; import javax.management.NotificationListener; import javax.management.ObjectName; import javax.management.timer.Timer; import javax.management.timer.TimerNotification; import junit.framework.TestCase; /** * Timer Notification Tests * * @author <a href="mailto:Adrian.Brock@HappeningTimes.com">Adrian Brock</a>. */ public class TimerNotificationTestCase extends TestCase implements NotificationListener { // Constants --------------------------------------------------------------- String TIMER_TYPE = "TimerType"; String MESSAGE = "Message"; String USER_DATA = "UserData"; // Attributes -------------------------------------------------------------- /** * The MBeanServer */ MBeanServer server; /** * The object name of the timer */ ObjectName timerName; /** * The timer */ Timer timer; /** * The timer notification id */ Integer id; /** * The notifications */ ArrayList notifications = new ArrayList(); // Constructor ------------------------------------------------------------- /** * Construct the test */ public TimerNotificationTestCase(String s) { super(s); } // Tests ------------------------------------------------------------------- /** * Test a notification gives reasonable values */ public void testReasonableValues() { initTest(); try { initTimer(); startTimer(); long startTime = timeOffset(0).getTime(); addNotification(TimerSUITE.ZERO_TIME); sync(); stopTimer(); long endTime = timeOffset(0).getTime(); assertEquals(1, notifications.size()); TimerNotification tn = (TimerNotification) notifications.get(0); assertEquals(MESSAGE, tn.getMessage()); assertEquals(1, tn.getSequenceNumber()); assertEquals(timerName, tn.getSource()); assertEquals(TIMER_TYPE, tn.getType()); assertEquals(USER_DATA, tn.getUserData()); assertEquals(id, tn.getNotificationID()); if (tn.getTimeStamp() < startTime + TimerSUITE.ZERO_TIME) fail("Timer notification before start?"); if (tn.getTimeStamp() > endTime) fail("Timer notification after end?"); } finally { MBeanServerFactory.releaseMBeanServer(server); } } // Support ----------------------------------------------------------------- /** * Start a new test */ private void initTest() { notifications.clear(); server = MBeanServerFactory.createMBeanServer(); } /** * Create a timer and register ourselves as a listener */ private void initTimer() { try { timer = new Timer(); timerName = new ObjectName("test:type=timer"); server.registerMBean(timer, timerName); server.addNotificationListener(timerName, this, null, null); } catch (Exception e) { fail(e.toString()); } } /** * Start the timer */ private void startTimer() { timer.start(); } /** * Stop the timer, does a small wait to avoid problems with the RI */ private void stopTimer() { sleep(); timer.stop(); } /** * Add a notification */ private void addNotification(long offset) { id = timer.addNotification(TIMER_TYPE, MESSAGE, USER_DATA, timeOffset(TimerSUITE.ZERO_TIME)); } /** * Handle the notification, just add it to the list */ public void handleNotification(Notification n, Object ignored) { notifications.add(n); synchronized(notifications) { notifications.notifyAll(); } } /** * Sync with the notification handler */ private void sync() { synchronized(notifications) { try { notifications.wait(TimerSUITE.MAX_WAIT); } catch (InterruptedException ignored) { } } } /** * Get the time using and offset */ private Date timeOffset(long offset) { return new Date(System.currentTimeMillis() + offset); } /** * Sleep for the default time */ private void sleep() { sleep(TimerSUITE.ZERO_TIME); } /** * Sleep for a bit */ private void sleep(long time) { try { Thread.sleep(time); } catch (InterruptedException ignored) { } } }