001: /*
002: * Copyright (C) The MX4J Contributors.
003: * All rights reserved.
004: *
005: * This software is distributed under the terms of the MX4J License version 1.0.
006: * See the terms of the MX4J License in the documentation provided with this software.
007: */
008:
009: package test.mx4j.tools.stats;
010:
011: import java.util.Date;
012: import java.util.SortedMap;
013: import javax.management.Attribute;
014: import javax.management.AttributeChangeNotification;
015: import javax.management.MBeanServer;
016: import javax.management.MBeanServerFactory;
017: import javax.management.NotificationBroadcasterSupport;
018: import javax.management.ObjectName;
019:
020: import junit.framework.TestCase;
021: import mx4j.tools.stats.PointTime;
022:
023: /**
024: * Test the Statistics MBeans
025: *
026: * @version $Revision: 1.4 $
027: */
028: public class StatsMBeansTest extends TestCase {
029: private MBeanServer server;
030:
031: /**
032: * Constructor requested by the JUnit framework
033: */
034: public StatsMBeansTest() {
035: super ("StatsMBeansTest Test");
036: }
037:
038: /**
039: * Constructor requested by the JUnit framework
040: */
041: public StatsMBeansTest(String name) {
042: super (name);
043: }
044:
045: public void setUp() {
046: try {
047: server = MBeanServerFactory.createMBeanServer("Stats");
048: } catch (Exception e) {
049: e.printStackTrace();
050: }
051: }
052:
053: public void tearDown() {
054: try {
055: MBeanServerFactory.releaseMBeanServer(server);
056: } catch (Exception e) {
057: e.printStackTrace();
058: }
059: }
060:
061: public void testValueMBean() throws Exception {
062: ObjectName name = new ObjectName("Domain:name=value");
063: try {
064: server.createMBean(
065: "mx4j.tools.stats.ValueStatisticsRecorder", name,
066: null);
067:
068: // Test that nothing happens if not started
069:
070: //Every time the value is set the statistics are updated
071: server.setAttribute(name, new Attribute("Value",
072: new Double(10)));
073: server.setAttribute(name, new Attribute("Value",
074: new Double(5)));
075: server.setAttribute(name, new Attribute("Value",
076: new Double(20)));
077:
078: assertEquals(new Long(0), server.getAttribute(name, "Max"));
079: assertEquals(new Long(0), server.getAttribute(name, "Min"));
080: assertEquals(new Long(0), server.getAttribute(name,
081: "Average"));
082: assertNull(server.getAttribute(name, "RecordingStart"));
083: assertEquals(0, ((SortedMap) server.getAttribute(name,
084: "Entries")).size());
085:
086: // start it
087: server.invoke(name, "start", null, null);
088:
089: //Every time the value is set the statistics are updated
090: server.setAttribute(name, new Attribute("Value",
091: new Double(10)));
092: server.setAttribute(name, new Attribute("Value",
093: new Double(5)));
094: server.setAttribute(name, new Attribute("Value",
095: new Double(20)));
096:
097: assertEquals(new Double(20), server.getAttribute(name,
098: "Max"));
099: assertEquals(new Double(5), server
100: .getAttribute(name, "Min"));
101: assertEquals(11.6, ((Double) server.getAttribute(name,
102: "Average")).doubleValue(), 0.1);
103: assertEquals(3, ((SortedMap) server.getAttribute(name,
104: "Entries")).size());
105: Date start1 = (Date) server.getAttribute(name,
106: "RecordingStart");
107:
108: // start it
109: server.invoke(name, "stop", null, null);
110: server.invoke(name, "start", null, null);
111:
112: // Restart with longs
113: server.setAttribute(name, new Attribute("Value", new Long(
114: 10)));
115: server.setAttribute(name, new Attribute("Value",
116: new Long(5)));
117: server.setAttribute(name, new Attribute("Value", new Long(
118: 20)));
119:
120: assertEquals(new Long(20), server.getAttribute(name, "Max"));
121: assertEquals(new Long(5), server.getAttribute(name, "Min"));
122: assertEquals(11, ((Long) server.getAttribute(name,
123: "Average")).longValue());
124: assertEquals(((SortedMap) server.getAttribute(name,
125: "Entries")).size(), 3);
126: Date start2 = (Date) server.getAttribute(name,
127: "RecordingStart");
128:
129: assertTrue(start1.equals(start2) || start1.before(start2));
130: SortedMap values = (SortedMap) server.getAttribute(name,
131: "Entries");
132: PointTime point1 = (PointTime) values.firstKey();
133: PointTime point2 = (PointTime) values.lastKey();
134: assertTrue(point1.getDate().equals(point2.getDate())
135: || point1.getDate().before(point2.getDate()));
136:
137: // re start it
138: server.invoke(name, "stop", null, null);
139: server.invoke(name, "start", null, null);
140:
141: int maxSize = ((Integer) server.getAttribute(name,
142: "MaxEntries")).intValue();
143: // set some random number
144: for (int i = 0; i < maxSize * 2; i++) {
145: server.setAttribute(name, new Attribute("Value",
146: new Double(Math.random())));
147: }
148:
149: // min has to be higher than 0
150: assertTrue(((Double) server.getAttribute(name, "Min"))
151: .doubleValue() >= 0);
152: // max has to be less than 1
153: assertTrue(((Double) server.getAttribute(name, "Max"))
154: .doubleValue() <= 1);
155:
156: //check than max size of entries has been kept
157: assertEquals(((SortedMap) server.getAttribute(name,
158: "Entries")).size(), maxSize);
159: } finally {
160: server.unregisterMBean(name);
161: }
162: }
163:
164: public void testNotificationMBean() throws Exception {
165: ObjectName name = new ObjectName("Domain:name=notification");
166: ObjectName beanName = new ObjectName("Domain:name=observed");
167: try {
168: server.createMBean(
169: "mx4j.tools.stats.NotificationStatisticsRecorder",
170: name, null);
171: Test t = new Test();
172: server.registerMBean(t, beanName);
173: server.setAttribute(name, new Attribute("ObservedObject",
174: beanName));
175: server.setAttribute(name, new Attribute(
176: "ObservedAttribute", "Value"));
177:
178: // Test that nothing happens if not started
179:
180: //Every time the value is set the statistics are updated
181: server.setAttribute(beanName, new Attribute("Value",
182: new Double(10)));
183: server.setAttribute(beanName, new Attribute("Value",
184: new Double(5)));
185: server.setAttribute(beanName, new Attribute("Value",
186: new Double(20)));
187:
188: assertEquals(new Long(0), server.getAttribute(name, "Max"));
189: assertEquals(new Long(0), server.getAttribute(name, "Min"));
190: assertEquals(new Long(0), server.getAttribute(name,
191: "Average"));
192: assertEquals(0, ((SortedMap) server.getAttribute(name,
193: "Entries")).size());
194:
195: // start it
196: server.invoke(name, "start", null, null);
197:
198: //Every time the value is set the statistics are updated
199: server.setAttribute(beanName, new Attribute("Value",
200: new Double(10)));
201: server.setAttribute(beanName, new Attribute("Value",
202: new Double(5)));
203: server.setAttribute(beanName, new Attribute("Value",
204: new Double(20)));
205:
206: assertEquals(new Double(20), server.getAttribute(name,
207: "Max"));
208: assertEquals(new Double(5), server
209: .getAttribute(name, "Min"));
210: assertEquals(11.6, ((Double) server.getAttribute(name,
211: "Average")).doubleValue(), 0.1);
212: assertEquals(3, ((SortedMap) server.getAttribute(name,
213: "Entries")).size());
214:
215: // start it
216: server.invoke(name, "stop", null, null);
217: server.invoke(name, "start", null, null);
218:
219: // Restart with longs
220: server.setAttribute(beanName, new Attribute("Value",
221: new Double(10)));
222: server.setAttribute(beanName, new Attribute("Value",
223: new Double(15)));
224: server.setAttribute(beanName, new Attribute("Value",
225: new Double(20)));
226:
227: assertEquals(new Double(20), server.getAttribute(name,
228: "Max"));
229: assertEquals(new Double(10), server.getAttribute(name,
230: "Min"));
231: assertEquals(15, ((Double) server.getAttribute(name,
232: "Average")).longValue());
233: assertEquals(((SortedMap) server.getAttribute(name,
234: "Entries")).size(), 3);
235:
236: } finally {
237: server.unregisterMBean(name);
238: }
239: }
240:
241: public synchronized void testTimedMBean() throws Exception {
242: ObjectName name = new ObjectName("Domain:name=notification");
243: ObjectName beanName = new ObjectName("Domain:name=observed");
244: try {
245: server.createMBean(
246: "mx4j.tools.stats.TimedStatisticsRecorder", name,
247: null);
248: Test t = new Test();
249: server.registerMBean(t, beanName);
250: server.setAttribute(name, new Attribute("ObservedObject",
251: beanName));
252: server.setAttribute(name, new Attribute(
253: "ObservedAttribute", "Value"));
254: server.setAttribute(name, new Attribute("Granularity",
255: new Long(1000)));
256:
257: // Test that nothing happens if not started
258:
259: //Every time the value is set the statistics are updated
260: server.setAttribute(beanName, new Attribute("Value",
261: new Double(10)));
262: server.setAttribute(beanName, new Attribute("Value",
263: new Double(5)));
264: server.setAttribute(beanName, new Attribute("Value",
265: new Double(20)));
266:
267: assertEquals(new Long(0), server.getAttribute(name, "Max"));
268: assertEquals(new Long(0), server.getAttribute(name, "Min"));
269: assertEquals(new Long(0), server.getAttribute(name,
270: "Average"));
271: assertEquals(0, ((SortedMap) server.getAttribute(name,
272: "Entries")).size());
273:
274: // start it
275: server.invoke(name, "start", null, null);
276:
277: //Every time the value is set the statistics are updated
278: server.setAttribute(beanName, new Attribute("Value",
279: new Double(10)));
280: Thread.currentThread().sleep(1500);
281: server.setAttribute(beanName, new Attribute("Value",
282: new Double(5)));
283: Thread.currentThread().sleep(1500);
284: server.setAttribute(beanName, new Attribute("Value",
285: new Double(20)));
286: Thread.currentThread().sleep(1500);
287:
288: assertEquals(new Double(20), server.getAttribute(name,
289: "Max"));
290: assertEquals(new Double(5), server
291: .getAttribute(name, "Min"));
292: // difficult to predict an exact value
293: assertTrue(((Double) server.getAttribute(name, "Average"))
294: .longValue() > 5
295: && ((Double) server.getAttribute(name, "Average"))
296: .longValue() < 20);
297: assertTrue(((SortedMap) server
298: .getAttribute(name, "Entries")).size() >= 3);
299:
300: // start it
301: server.invoke(name, "stop", null, null);
302: server.invoke(name, "start", null, null);
303:
304: // Restart with longs
305: server.setAttribute(beanName, new Attribute("Value",
306: new Double(10)));
307: Thread.currentThread().sleep(1500);
308: server.setAttribute(beanName, new Attribute("Value",
309: new Double(15)));
310: Thread.currentThread().sleep(1500);
311: server.setAttribute(beanName, new Attribute("Value",
312: new Double(20)));
313: Thread.currentThread().sleep(1500);
314:
315: assertEquals(new Double(20), server.getAttribute(name,
316: "Max"));
317: assertEquals(new Double(10), server.getAttribute(name,
318: "Min"));
319: // difficult to predict an exact value
320: assertTrue(((Double) server.getAttribute(name, "Average"))
321: .longValue() >= 15
322: && ((Double) server.getAttribute(name, "Average"))
323: .longValue() <= 20);
324: assertTrue(((SortedMap) server
325: .getAttribute(name, "Entries")).size() >= 3);
326:
327: } finally {
328: server.unregisterMBean(name);
329: }
330: }
331:
332: public interface TestMBean {
333: public double getValue();
334:
335: public void setValue(double value);
336: }
337:
338: public class Test extends NotificationBroadcasterSupport implements
339: TestMBean {
340: private double value;
341:
342: public double getValue() {
343: return value;
344: }
345:
346: public void setValue(double value) {
347: double oldValue = this .value;
348: this .value = value;
349: sendNotification(new AttributeChangeNotification(this , 0L,
350: System.currentTimeMillis(), "test", "Value",
351: Double.class.toString(), new Double(oldValue),
352: new Double(value)));
353: }
354: }
355:
356: }
|