| /* |
| * 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 EventManagerTest.java 1.8 08/01/22 |
| * @bug 5108776 |
| * @summary Basic test for EventManager. |
| * @author Shanliang JIANG |
| * @run clean EventManagerTest |
| * @run build EventManagerTest |
| * @run main EventManagerTest |
| */ |
| |
| import javax.management.MBeanNotificationInfo; |
| 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.*; |
| 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 EventManagerTest { |
| private static MBeanServer mbeanServer; |
| private static ObjectName emitter; |
| private static JMXServiceURL url; |
| private static JMXConnectorServer server; |
| private static JMXConnector conn; |
| private static MBeanServerConnection client; |
| |
| /** |
| * @param args the command line arguments |
| */ |
| public static void main(String[] args) throws Exception { |
| System.out.println(">>> EventManagerTest-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"); |
| |
| url = new JMXServiceURL("rmi", null, 0) ; |
| server = |
| JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbeanServer); |
| server.start(); |
| |
| url = server.getAddress(); |
| conn = JMXConnectorFactory.connect(url, null); |
| client = conn.getMBeanServerConnection(); |
| |
| mbeanServer.registerMBean(new NotificationEmitter(), emitter); |
| |
| boolean succeed; |
| |
| System.out.println(">>> EventManagerTest-main: using the fetching EventRelay..."); |
| succeed = test(new EventClient(client)); |
| |
| System.out.println(">>> EventManagerTest-main: using the pushing EventRelay..."); |
| EventClientDelegateMBean ecd = EventClientDelegate.getProxy(client); |
| succeed &= test(new EventClient(ecd, |
| new RMIPushEventRelay(ecd), |
| null, null, |
| EventClient.DEFAULT_LEASE_TIMEOUT)); |
| |
| conn.close(); |
| server.stop(); |
| |
| if (succeed) { |
| System.out.println(">>> EventManagerTest-main: PASSE!"); |
| } else { |
| System.out.println("\n>>> EventManagerTest-main: FAILED!"); |
| System.exit(1); |
| } |
| } |
| |
| public static boolean test(EventClient efClient) throws Exception { |
| // add listener from the client side |
| Listener listener = new Listener(); |
| efClient.subscribe(emitter, listener, null, null); |
| |
| // ask to send notifs |
| Object[] params = new Object[] {new Integer(sendNB)}; |
| String[] signatures = new String[] {"java.lang.Integer"}; |
| client.invoke(emitter, "sendNotifications", params, signatures); |
| |
| // waiting |
| long toWait = 6000; |
| long stopTime = System.currentTimeMillis() + toWait; |
| |
| synchronized(listener) { |
| while(listener.received < sendNB && toWait > 0) { |
| listener.wait(toWait); |
| toWait = stopTime - System.currentTimeMillis(); |
| } |
| } |
| |
| // clean |
| System.out.println(">>> EventManagerTest-test: cleaning..."); |
| efClient.unsubscribe(emitter, listener); |
| efClient.close(); |
| |
| if (listener.received != sendNB) { |
| System.out.println(">>> EventManagerTest-test: FAILED! Expected to receive "+sendNB+", but got "+listener.received); |
| |
| return false; |
| } else if (listener.seqErr > 0) { |
| System.out.println(">>> EventManagerTest-test: FAILED! The receiving sequence is not correct."); |
| |
| return false; |
| } else { |
| System.out.println(">>> EventManagerTest-test: got all expected "+listener.received); |
| return true; |
| } |
| } |
| |
| private static class Listener implements NotificationListener { |
| public int received = 0; |
| public int seqErr = 0; |
| |
| private long lastSeq = -1; |
| |
| public void handleNotification(Notification notif, Object handback) { |
| if (!myType.equals(notif.getType())) { |
| System.out.println(">>> EventManagerTest-Listener: got unexpected notif: "+notif); |
| System.exit(1); |
| } |
| |
| if (lastSeq == -1) { |
| lastSeq = notif.getSequenceNumber(); |
| } else if (notif.getSequenceNumber() - lastSeq++ != 1) { |
| seqErr++; |
| } |
| |
| //System.out.println(">>> EventManagerTest-Listener: got notif "+notif.getSequenceNumber()); |
| |
| synchronized(this) { |
| if (++received >= sendNB) { |
| this.notify(); |
| } |
| } |
| } |
| } |
| |
| public static class NotificationEmitter extends NotificationBroadcasterSupport |
| implements NotificationEmitterMBean { |
| |
| public MBeanNotificationInfo[] getNotificationInfo() { |
| final String[] ntfTypes = {myType}; |
| |
| final MBeanNotificationInfo[] ntfInfoArray = { |
| new MBeanNotificationInfo(ntfTypes, |
| "javax.management.Notification", |
| "Notifications sent by the NotificationEmitter")}; |
| |
| return ntfInfoArray; |
| } |
| |
| /** |
| * Send Notification objects. |
| * |
| * @param nb The number of notifications to send |
| */ |
| public void sendNotifications(Integer nb) { |
| Notification notif; |
| for (int i=1; i<=nb.intValue(); i++) { |
| notif = new Notification(myType, this, count++); |
| notif.setUserData("jsl"); |
| //System.out.println(">>> EventManagerService-NotificationEmitter-sendNotifications: "+i); |
| |
| sendNotification(notif); |
| } |
| } |
| } |
| |
| public interface NotificationEmitterMBean { |
| public void sendNotifications(Integer nb); |
| } |
| |
| private static int sendNB = 120; |
| private static long count = 0; |
| |
| private static final String myType = "notification.my_notification"; |
| } |