/* * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Oracle nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * This source code is provided to illustrate the usage of a given feature * or technique and has been deliberately simplified. Additional steps * required for a production-quality application, such as security checks, * input validation and proper error handling, might not be present in * this sample code. */ package com.sun.jmx.examples.scandir; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import javax.management.InstanceNotFoundException; import javax.management.Notification; import junit.framework.*; import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*; import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState; import java.io.IOException; import java.lang.management.ManagementFactory; import java.util.EnumSet; import java.util.HashMap; import java.util.logging.Logger; import javax.management.AttributeChangeNotification; import javax.management.JMException; import javax.management.JMX; import javax.management.ListenerNotFoundException; import javax.management.MBeanNotificationInfo; import javax.management.MBeanRegistration; import javax.management.MBeanServer; import javax.management.MBeanServerConnection; import javax.management.NotificationBroadcasterSupport; import javax.management.NotificationEmitter; import javax.management.NotificationFilter; import javax.management.NotificationListener; import javax.management.ObjectInstance; import javax.management.ObjectName; import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*; /** * Unit tests for {@code ScanManager} * * @author Sun Microsystems, 2006 - All rights reserved. */ public class ScanManagerTest extends TestCase { public ScanManagerTest(String testName) { super(testName); } protected void setUp() throws Exception { } protected void tearDown() throws Exception { } public static Test suite() { TestSuite suite = new TestSuite(ScanManagerTest.class); return suite; } /** * Test of makeSingletonName method, of class com.sun.jmx.examples.scandir.ScanManager. */ public void testMakeSingletonName() { System.out.println("makeSingletonName"); Class clazz = ScanManagerMXBean.class; ObjectName expResult = ScanManager.SCAN_MANAGER_NAME; ObjectName result = ScanManager.makeSingletonName(clazz); assertEquals(expResult, result); } /** * Test of register method, of class com.sun.jmx.examples.scandir.ScanManager. */ public void testRegister() throws Exception { System.out.println("register"); MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ScanManagerMXBean result = ScanManager.register(mbs); try { assertEquals(STOPPED,result.getState()); } finally { try { mbs.unregisterMBean(ScanManager.SCAN_MANAGER_NAME); } catch (Exception x) { System.err.println("Failed to cleanup: "+x); } } } public interface Call { public void call() throws Exception; public void cancel() throws Exception; } /** * Test of addNotificationListener method, of class com.sun.jmx.examples.scandir.ScanManager. */ public void testAddNotificationListener() throws Exception { System.out.println("addNotificationListener"); final ScanManagerMXBean manager = ScanManager.register(); final Call op = new Call() { public void call() throws Exception { manager.schedule(100000,0); } public void cancel() throws Exception { manager.stop(); } }; try { doTestOperation(manager,op, EnumSet.of(RUNNING,SCHEDULED), "schedule"); } finally { try { ManagementFactory.getPlatformMBeanServer(). unregisterMBean(ScanManager.SCAN_MANAGER_NAME); } catch (Exception x) { System.err.println("Failed to cleanup: "+x); } } } /** * Test of addNotificationListener method, of class com.sun.jmx.examples.scandir.ScanManager. */ private void doTestOperation( ScanManagerMXBean proxy, Call op, EnumSet<ScanState> after, String testName) throws Exception { System.out.println("doTestOperation: "+testName); final LinkedBlockingQueue<Notification> queue = new LinkedBlockingQueue<Notification>(); NotificationListener listener = new NotificationListener() { public void handleNotification(Notification notification, Object handback) { try { queue.put(notification); } catch (Exception x) { System.err.println("Failed to queue notif: "+x); } } }; NotificationFilter filter = null; Object handback = null; final ScanState before; final NotificationEmitter emitter = (NotificationEmitter)proxy; emitter.addNotificationListener(listener, filter, handback); before = proxy.getState(); op.call(); try { final Notification notification = queue.poll(3000,TimeUnit.MILLISECONDS); assertEquals(AttributeChangeNotification.ATTRIBUTE_CHANGE, notification.getType()); assertEquals(AttributeChangeNotification.class, notification.getClass()); assertEquals(ScanManager.SCAN_MANAGER_NAME, notification.getSource()); AttributeChangeNotification acn = (AttributeChangeNotification)notification; assertEquals("State",acn.getAttributeName()); assertEquals(ScanState.class.getName(),acn.getAttributeType()); assertEquals(before,ScanState.valueOf((String)acn.getOldValue())); assertContained(after,ScanState.valueOf((String)acn.getNewValue())); emitter.removeNotificationListener(listener,filter,handback); } finally { try { op.cancel(); } catch (Exception x) { System.err.println("Failed to cleanup: "+x); } } } /** * Test of preRegister method, of class com.sun.jmx.examples.scandir.ScanManager. */ public void testPreRegister() throws Exception { System.out.println("preRegister"); MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("DownUnder:type=Wombat"); ScanManager instance = new ScanManager(); ObjectName expResult = ScanManager.SCAN_MANAGER_NAME; ObjectName result; try { result = instance.preRegister(server, name); throw new RuntimeException("bad name accepted!"); } catch (IllegalArgumentException x) { // OK! result = instance.preRegister(server, null); } assertEquals(expResult, result); result = instance.preRegister(server, ScanManager.SCAN_MANAGER_NAME); assertEquals(expResult, result); } /** * Test of getState method, of class com.sun.jmx.examples.scandir.ScanManager. */ public void testGetState() throws IOException, InstanceNotFoundException { System.out.println("getState"); ScanManager instance = new ScanManager(); ScanState expResult = ScanState.STOPPED; ScanState result = instance.getState(); assertEquals(expResult, result); instance.start(); final ScanState afterStart = instance.getState(); assertContained(EnumSet.of(RUNNING,SCHEDULED,COMPLETED),afterStart); instance.stop(); assertEquals(STOPPED,instance.getState()); instance.schedule(1000000L,1000000L); assertEquals(SCHEDULED,instance.getState()); instance.stop(); assertEquals(STOPPED,instance.getState()); } /** * Test of schedule method, of class com.sun.jmx.examples.scandir.ScanManager. */ public void testSchedule() throws Exception { System.out.println("schedule"); final long delay = 10000L; final long interval = 10000L; final ScanManagerMXBean manager = ScanManager.register(); final Call op = new Call() { public void call() throws Exception { manager.schedule(delay,interval); assertEquals(SCHEDULED,manager.getState()); } public void cancel() throws Exception { manager.stop(); } }; try { doTestOperation(manager,op,EnumSet.of(SCHEDULED), "schedule"); } finally { try { ManagementFactory.getPlatformMBeanServer(). unregisterMBean(ScanManager.SCAN_MANAGER_NAME); } catch (Exception x) { System.err.println("Failed to cleanup: "+x); } } } public static void assertContained(EnumSet<ScanState> allowed, ScanState state) { final String msg = String.valueOf(state) + " is not one of " + allowed; assertTrue(msg,allowed.contains(state)); } /** * Test of stop method, of class com.sun.jmx.examples.scandir.ScanManager. */ public void testStop() throws Exception { System.out.println("stop"); final ScanManagerMXBean manager = ScanManager.register(); try { manager.schedule(1000000,0); assertContained(EnumSet.of(SCHEDULED),manager.getState()); final Call op = new Call() { public void call() throws Exception { manager.stop(); assertEquals(STOPPED,manager.getState()); } public void cancel() throws Exception { if (manager.getState() != STOPPED) manager.stop(); } }; doTestOperation(manager,op,EnumSet.of(STOPPED),"stop"); } finally { try { ManagementFactory.getPlatformMBeanServer(). unregisterMBean(ScanManager.SCAN_MANAGER_NAME); } catch (Exception x) { System.err.println("Failed to cleanup: "+x); } } } /** * Test of start method, of class com.sun.jmx.examples.scandir.ScanManager. */ public void testStart() throws Exception { final ScanManagerMXBean manager = ScanManager.register(); try { final Call op = new Call() { public void call() throws Exception { assertEquals(STOPPED,manager.getState()); manager.start(); assertContained(EnumSet.of(RUNNING,SCHEDULED,COMPLETED), manager.getState()); } public void cancel() throws Exception { manager.stop(); } }; doTestOperation(manager,op,EnumSet.of(RUNNING,SCHEDULED,COMPLETED), "start"); } finally { try { ManagementFactory.getPlatformMBeanServer(). unregisterMBean(ScanManager.SCAN_MANAGER_NAME); } catch (Exception x) { System.err.println("Failed to cleanup: "+x); } } } }