blob: 94e3c9811874f9e28c48e8821caeec32270bf101 [file] [log] [blame]
/*
* 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);
}
}
}
}