blob: 8903d88dc30ab9d33385cc51f3fd32cda060b1f2 [file] [log] [blame]
/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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 General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/*
* @test
* @bug 4911721
* @summary test on add/remove NotificationListener
* @author Shanliang JIANG
* @run clean DiffHBTest
* @run build DiffHBTest
* @run main DiffHBTest
*/
import java.net.MalformedURLException;
import java.io.IOException;
import javax.management.*;
import javax.management.remote.*;
/**
* This test registeres an unique listener with two different handbacks,
* it expects to receive a same notification two times.
*/
public class DiffHBTest {
private static final String[] protocols = {"rmi", "iiop", "jmxmp"};
private static final MBeanServer mbs = MBeanServerFactory.createMBeanServer();
private static ObjectName delegateName;
private static ObjectName timerName;
public static int received = 0;
public static final int[] receivedLock = new int[0];
public static Notification receivedNotif = null;
public static Object receivedHB = null;
public static final String[] hbs = new String[] {"0", "1"};
public static void main(String[] args) throws Exception {
System.out.println(">>> test on one listener with two different handbacks.");
delegateName = new ObjectName("JMImplementation:type=MBeanServerDelegate");
timerName = new ObjectName("MBean:name=Timer");
boolean ok = true;
for (int i = 0; i < protocols.length; i++) {
try {
if (!test(protocols[i])) {
System.out.println(">>> Test failed for " + protocols[i]);
ok = false;
} else {
System.out.println(">>> Test successed for " + protocols[i]);
}
} catch (Exception e) {
System.out.println(">>> Test failed for " + protocols[i]);
e.printStackTrace(System.out);
ok = false;
}
}
if (ok) {
System.out.println(">>> Test passed");
} else {
System.out.println(">>> TEST FAILED");
System.exit(1);
}
}
private static boolean test(String proto) throws Exception {
System.out.println(">>> Test for protocol " + proto);
JMXServiceURL u = new JMXServiceURL(proto, null, 0);
JMXConnectorServer server;
JMXServiceURL addr;
JMXConnector client;
MBeanServerConnection mserver;
final NotificationListener dummyListener = new NotificationListener() {
public void handleNotification(Notification n, Object o) {
synchronized(receivedLock) {
if (n == null) {
System.out.println(">>> Got a null notification.");
System.exit(1);
}
// check number
if (received > 2) {
System.out.println(">>> Expect to receive 2 notifs, but get "+received);
System.exit(1);
}
if (received == 0) { // first time
receivedNotif = n;
receivedHB = o;
if (!hbs[0].equals(o) && !hbs[1].equals(o)) {
System.out.println(">>> Unkown handback: "+o);
System.exit(1);
}
} else { // second time
if (!receivedNotif.equals(n)) {
System.out.println(">>> Not get same notif twice.");
System.exit(1);
} else if (!hbs[0].equals(o) && !hbs[1].equals(o)) { // validate handback
System.out.println(">>> Unkown handback: "+o);
System.exit(1);
} else if (receivedHB.equals(o)) {
System.out.println(">>> Got same handback twice: "+o);
System.exit(1);
}
}
++received;
if (received == 2) {
receivedLock.notify();
}
}
}
};
try {
server = JMXConnectorServerFactory.newJMXConnectorServer(u, null, mbs);
server.start();
addr = server.getAddress();
client = JMXConnectorFactory.newJMXConnector(addr, null);
client.connect(null);
mserver = client.getMBeanServerConnection();
mserver.addNotificationListener(delegateName, dummyListener, null, hbs[0]);
mserver.addNotificationListener(delegateName, dummyListener, null, hbs[1]);
for (int i=0; i<20; i++) {
synchronized(receivedLock) {
received = 0;
}
mserver.createMBean("javax.management.timer.Timer", timerName);
synchronized(receivedLock) {
if (received != 2) {
long remainingTime = waitingTime;
final long startTime = System.currentTimeMillis();
while (received != 2 && remainingTime > 0) {
receivedLock.wait(remainingTime);
remainingTime = waitingTime -
(System.currentTimeMillis() - startTime);
}
}
if (received != 2) {
System.out.println(">>> Expected 2 notifis, but received "+received);
return false;
}
}
synchronized(receivedLock) {
received = 0;
}
mserver.unregisterMBean(timerName);
synchronized(receivedLock) {
if (received != 2) {
long remainingTime = waitingTime;
final long startTime = System.currentTimeMillis();
while (received != 2 && remainingTime >0) {
receivedLock.wait(remainingTime);
remainingTime = waitingTime -
(System.currentTimeMillis() - startTime);
}
}
if (received != 2) {
System.out.println(">>> Expected 2 notifis, but received "+received);
return false;
}
}
}
mserver.removeNotificationListener(delegateName, dummyListener);
client.close();
server.stop();
} catch (MalformedURLException e) {
System.out.println(">>> Skipping unsupported URL " + u);
return true;
}
return true;
}
private final static long waitingTime = 10000;
}