| /* |
| * Copyright 2007 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 5108776 |
| * @summary Basic test for EventClient. |
| * @author Shanliang JIANG |
| * @run clean FetchingTest MyFetchingEventForwarder |
| * @run build FetchingTest MyFetchingEventForwarder |
| * @run main FetchingTest MyFetchingEventForwarder |
| */ |
| |
| import javax.management.MBeanServer; |
| import javax.management.MBeanServerConnection; |
| import javax.management.MBeanServerFactory; |
| import javax.management.Notification; |
| import javax.management.NotificationBroadcasterSupport; |
| import javax.management.NotificationListener; |
| import javax.management.ObjectName; |
| import javax.management.event.EventClient; |
| import javax.management.event.EventClientDelegate; |
| import javax.management.event.EventClientDelegateMBean; |
| import javax.management.event.FetchingEventRelay; |
| import javax.management.event.RMIPushEventForwarder; |
| import javax.management.event.RMIPushServer; |
| import javax.management.remote.JMXConnector; |
| import javax.management.remote.JMXConnectorFactory; |
| import javax.management.remote.JMXConnectorServer; |
| import javax.management.remote.JMXConnectorServerFactory; |
| import javax.management.remote.JMXServiceURL; |
| |
| public class FetchingTest { |
| private static MBeanServer mbeanServer; |
| private static ObjectName emitter; |
| private static JMXServiceURL url; |
| private static JMXConnectorServer server; |
| private static JMXConnector conn; |
| private static MBeanServerConnection client; |
| private static long WAITING_TIME = 6000; |
| |
| /** |
| * @param args the command line arguments |
| */ |
| public static void main(String[] args) throws Exception { |
| |
| System.out.println(">>> FetchingTest-main basic tests ..."); |
| mbeanServer = MBeanServerFactory.createMBeanServer(); |
| |
| // for 1.5 |
| if (System.getProperty("java.version").startsWith("1.5") && |
| !mbeanServer.isRegistered(EventClientDelegateMBean.OBJECT_NAME)) { |
| System.out.print("Working on "+System.getProperty("java.version")+ |
| " register "+EventClientDelegateMBean.OBJECT_NAME); |
| |
| mbeanServer.registerMBean(EventClientDelegate. |
| getEventClientDelegate(mbeanServer), |
| EventClientDelegateMBean.OBJECT_NAME); |
| } |
| |
| emitter = new ObjectName("Default:name=NotificationEmitter"); |
| mbeanServer.registerMBean(new NotificationEmitter(), emitter); |
| boolean succeed = true; |
| |
| final String[] protos = new String[] {"rmi", "iiop", "jmxmp"}; |
| for (String proto : protos) { |
| System.out.println(">>> FetchingTest-main: testing on "+proto); |
| |
| try { |
| url = new JMXServiceURL(proto, null, 0) ; |
| server = JMXConnectorServerFactory. |
| newJMXConnectorServer(url, null, mbeanServer); |
| server.start(); |
| } catch (Exception e) { |
| // OK |
| System.out.println(">>> FetchingTest-main: skip the proto "+proto); |
| continue; |
| } |
| |
| url = server.getAddress(); |
| conn = JMXConnectorFactory.connect(url, null); |
| client = conn.getMBeanServerConnection(); |
| |
| succeed &= test(); |
| |
| conn.close(); |
| server.stop(); |
| |
| System.out.println( |
| ">>> FetchingTest-main: testing on "+proto+" done."); |
| } |
| |
| if (succeed) { |
| System.out.println(">>> FetchingTest-main: PASSED!"); |
| } else { |
| System.out.println("\n>>> FetchingTest-main: FAILED!"); |
| System.exit(1); |
| } |
| } |
| |
| public static boolean test() throws Exception { |
| System.out.println(">>> FetchingTest-test: " + |
| "using the default fetching forwarder ..."); |
| EventClient eventClient = |
| new EventClient(client); |
| |
| Listener listener = new Listener(); |
| eventClient.addNotificationListener(emitter, listener, null, null); |
| |
| // ask to send notifs |
| Object[] params = new Object[] {new Integer(sendNB)}; |
| String[] signatures = new String[] {"java.lang.Integer"}; |
| conn.getMBeanServerConnection().invoke(emitter, |
| "sendNotifications", params, signatures); |
| |
| if (listener.waitNotif(WAITING_TIME) != sendNB) { |
| System.out.println( |
| ">>> FetchingTest-test: FAILED! Expected to receive "+ |
| sendNB+", but got "+listener.received); |
| |
| return false; |
| } |
| |
| System.out.println( |
| ">>> ListenerTest-test: got all expected "+listener.received); |
| //eventClient.removeNotificationListener(emitter, listener); |
| eventClient.close(); |
| |
| System.out.println(">>> FetchingTest-test: " + |
| "using a user specific List ..."); |
| |
| FetchingEventRelay fer = new FetchingEventRelay( |
| EventClientDelegate.getProxy(client), |
| 1000, 1000L, 1000, null, |
| MyFetchingEventForwarder.class.getName(), |
| null, null); |
| |
| eventClient = new EventClient( |
| EventClientDelegate.getProxy(client), fer, null, null, 10000); |
| |
| eventClient.addNotificationListener(emitter, listener, null, null); |
| listener.received = 0; |
| |
| conn.getMBeanServerConnection().invoke(emitter, |
| "sendNotifications", params, signatures); |
| |
| if (listener.waitNotif(WAITING_TIME) != sendNB) { |
| System.out.println( |
| ">>> FetchingTest-test: FAILED! Expected to receive "+ |
| sendNB+", but got "+listener.received); |
| |
| return false; |
| } |
| |
| System.out.println( |
| ">>> FetchingTest-test: got all expected "+listener.received); |
| |
| if (!MyFetchingEventForwarder.shared.isUsed()) { |
| System.out.println( |
| ">>> FetchingTest-test: FAILED! The user specific list" + |
| "is not used!"); |
| |
| return false; |
| } |
| |
| System.out.println(">>> Negative test to add an EventClient" + |
| " with a non EventForwarder object."); |
| try { |
| MyFetchingEventForwarder.shared.setAgain(); |
| |
| System.out.println( |
| ">>> FetchingTest-test: FAILED! No expected exception" + |
| "when setting the list after the forwarder started."); |
| |
| return false; |
| } catch (IllegalStateException ise) { |
| // OK |
| System.out.println( |
| ">>> FetchingTest-test: Got expected exception: " + ise); |
| } |
| |
| eventClient.close(); |
| |
| try { |
| fer = new FetchingEventRelay( |
| EventClientDelegate.getProxy(client), |
| 1000, 1000L, 1000, null, |
| Object.class.getName(), |
| null, null); |
| |
| eventClient = new EventClient( |
| EventClientDelegate.getProxy(client), fer, null, null, 10000); |
| |
| System.out.println( |
| ">>> FetchingTest-test: FAILED! No expected exception" + |
| "when creating an illegal EventForwarder"); |
| } catch (IllegalArgumentException iae) { |
| // OK |
| // iae.printStackTrace(); |
| } |
| |
| return true; |
| } |
| |
| private static class Listener implements NotificationListener { |
| public void handleNotification(Notification notif, Object handback) { |
| synchronized(this) { |
| if (++received >= sendNB) { |
| this.notify(); |
| } |
| } |
| |
| //System.out.println(">>> FetchingTest-Listener: received = "+received); |
| } |
| |
| public int waitNotif(long timeout) throws Exception { |
| synchronized(this) { |
| long stopTime = System.currentTimeMillis() + timeout; |
| long toWait = timeout; |
| while (toWait > 0 && received < sendNB) { |
| this.wait(toWait); |
| toWait = stopTime - System.currentTimeMillis(); |
| } |
| } |
| |
| return received; |
| } |
| |
| public static int received = 0; |
| } |
| |
| public static class NotificationEmitter extends NotificationBroadcasterSupport |
| implements NotificationEmitterMBean { |
| |
| public void sendNotifications(Integer nb) { |
| System.out.println( |
| ">>> FetchingTest-NotificationEmitter-sendNotifications: "+nb); |
| Notification notif; |
| for (int i=1; i<=nb.intValue(); i++) { |
| notif = new Notification(myType, this, count++); |
| sendNotification(notif); |
| } |
| } |
| } |
| |
| public interface NotificationEmitterMBean { |
| public void sendNotifications(Integer nb); |
| } |
| |
| |
| |
| private static int sendNB = 20; |
| private static int count = 0; |
| |
| private static final String myType = "notification.my_notification"; |
| } |