001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package test.compliance.timer;
023:
024: import java.util.ArrayList;
025: import java.util.Date;
026:
027: import javax.management.MBeanServer;
028: import javax.management.MBeanServerFactory;
029: import javax.management.Notification;
030: import javax.management.NotificationListener;
031: import javax.management.ObjectName;
032: import javax.management.timer.Timer;
033: import javax.management.timer.TimerNotification;
034:
035: import junit.framework.TestCase;
036:
037: /**
038: * Timer Notification Tests
039: *
040: * @author <a href="mailto:Adrian.Brock@HappeningTimes.com">Adrian Brock</a>.
041: */
042: public class TimerNotificationTestCase extends TestCase implements
043: NotificationListener {
044: // Constants ---------------------------------------------------------------
045:
046: String TIMER_TYPE = "TimerType";
047: String MESSAGE = "Message";
048: String USER_DATA = "UserData";
049:
050: // Attributes --------------------------------------------------------------
051:
052: /**
053: * The MBeanServer
054: */
055: MBeanServer server;
056:
057: /**
058: * The object name of the timer
059: */
060: ObjectName timerName;
061:
062: /**
063: * The timer
064: */
065: Timer timer;
066:
067: /**
068: * The timer notification id
069: */
070: Integer id;
071:
072: /**
073: * The notifications
074: */
075: ArrayList notifications = new ArrayList();
076:
077: // Constructor -------------------------------------------------------------
078:
079: /**
080: * Construct the test
081: */
082: public TimerNotificationTestCase(String s) {
083: super (s);
084: }
085:
086: // Tests -------------------------------------------------------------------
087:
088: /**
089: * Test a notification gives reasonable values
090: */
091: public void testReasonableValues() {
092: initTest();
093: try {
094: initTimer();
095: startTimer();
096: long startTime = timeOffset(0).getTime();
097: addNotification(TimerSUITE.ZERO_TIME);
098: sync();
099: stopTimer();
100: long endTime = timeOffset(0).getTime();
101:
102: assertEquals(1, notifications.size());
103: TimerNotification tn = (TimerNotification) notifications
104: .get(0);
105: assertEquals(MESSAGE, tn.getMessage());
106: assertEquals(1, tn.getSequenceNumber());
107: assertEquals(timerName, tn.getSource());
108: assertEquals(TIMER_TYPE, tn.getType());
109: assertEquals(USER_DATA, tn.getUserData());
110: assertEquals(id, tn.getNotificationID());
111: if (tn.getTimeStamp() < startTime + TimerSUITE.ZERO_TIME)
112: fail("Timer notification before start?");
113: if (tn.getTimeStamp() > endTime)
114: fail("Timer notification after end?");
115: } finally {
116: MBeanServerFactory.releaseMBeanServer(server);
117: }
118: }
119:
120: // Support -----------------------------------------------------------------
121:
122: /**
123: * Start a new test
124: */
125: private void initTest() {
126: notifications.clear();
127: server = MBeanServerFactory.createMBeanServer();
128: }
129:
130: /**
131: * Create a timer and register ourselves as a listener
132: */
133: private void initTimer() {
134: try {
135: timer = new Timer();
136: timerName = new ObjectName("test:type=timer");
137: server.registerMBean(timer, timerName);
138: server.addNotificationListener(timerName, this , null, null);
139: } catch (Exception e) {
140: fail(e.toString());
141: }
142: }
143:
144: /**
145: * Start the timer
146: */
147: private void startTimer() {
148: timer.start();
149: }
150:
151: /**
152: * Stop the timer, does a small wait to avoid problems with the RI
153: */
154: private void stopTimer() {
155: sleep();
156: timer.stop();
157: }
158:
159: /**
160: * Add a notification
161: */
162: private void addNotification(long offset) {
163: id = timer.addNotification(TIMER_TYPE, MESSAGE, USER_DATA,
164: timeOffset(TimerSUITE.ZERO_TIME));
165: }
166:
167: /**
168: * Handle the notification, just add it to the list
169: */
170: public void handleNotification(Notification n, Object ignored) {
171: notifications.add(n);
172: synchronized (notifications) {
173: notifications.notifyAll();
174: }
175: }
176:
177: /**
178: * Sync with the notification handler
179: */
180: private void sync() {
181: synchronized (notifications) {
182: try {
183: notifications.wait(TimerSUITE.MAX_WAIT);
184: } catch (InterruptedException ignored) {
185: }
186: }
187: }
188:
189: /**
190: * Get the time using and offset
191: */
192: private Date timeOffset(long offset) {
193: return new Date(System.currentTimeMillis() + offset);
194: }
195:
196: /**
197: * Sleep for the default time
198: */
199: private void sleep() {
200: sleep(TimerSUITE.ZERO_TIME);
201: }
202:
203: /**
204: * Sleep for a bit
205: */
206: private void sleep(long time) {
207: try {
208: Thread.sleep(time);
209: } catch (InterruptedException ignored) {
210: }
211: }
212: }
|