blob: ff8479d522c49795b4ca6912f8bbf7c17c415698 [file] [log] [blame]
/*
* Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.glassfish.admin.amxtest.base;
import com.sun.appserv.management.base.NotificationService;
import com.sun.appserv.management.base.NotificationServiceMgr;
import com.sun.appserv.management.base.QueryMgr;
import com.sun.appserv.management.base.Util;
import com.sun.appserv.management.helper.NotificationServiceHelper;
import org.glassfish.admin.amxtest.AMXTestBase;
import org.glassfish.admin.amxtest.Capabilities;
import javax.management.AttributeChangeNotification;
import javax.management.InstanceNotFoundException;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.ObjectName;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
*/
public final class NotificationServiceTest
extends AMXTestBase {
public NotificationServiceTest() {
}
public static Capabilities
getCapabilities() {
return getOfflineCapableCapabilities(true);
}
public NotificationService
create() {
final NotificationServiceMgr proxy = getNotificationServiceMgr();
return (proxy.createNotificationService("test", 512));
}
public void
testCreate()
throws Exception {
final NotificationService proxy = create();
removeNotificationService(proxy);
}
public void
testGetFromEmpty()
throws Exception {
final NotificationService proxy = create();
assert (proxy.getListeneeSet().size() == 0);
final Object id = proxy.createBuffer(10, null);
final Map<String, Object> result = proxy.getBufferNotifications(id, 0);
final Notification[] notifs = (Notification[]) result.get(proxy.NOTIFICATIONS_KEY);
assertEquals(0, notifs.length);
}
private void
removeNotificationService(final NotificationService service)
throws InstanceNotFoundException {
getNotificationServiceMgr().removeNotificationService(service.getName());
}
private static final class MyListener
implements NotificationListener {
private final List<Notification> mReceived;
private final CountDownLatch mLatch;
public MyListener( final int numNeeded ) {
mReceived = Collections.synchronizedList(new ArrayList<Notification>());
mLatch = new CountDownLatch(numNeeded);
}
public void
handleNotification(
final Notification notif,
final Object handback) {
mReceived.add(notif);
mLatch.countDown();
}
public boolean await( final long amt, final TimeUnit units )
throws InterruptedException
{
return mLatch.await( amt, units);
}
public int
getCount() {
return (mReceived.size());
}
}
private static void
sleep(int duration) {
try {
Thread.sleep(duration);
}
catch (InterruptedException e) {
}
}
public void
testListen()
throws Exception {
//trace( "testListen: START" );
final NotificationService proxy = create();
final QueryMgr queryMgr = getQueryMgr();
final ObjectName objectName = Util.getObjectName(queryMgr);
final Object id = proxy.createBuffer(10, null);
final NotificationServiceHelper helper = new NotificationServiceHelper(proxy, id);
proxy.listenTo(objectName, null);
assert (proxy.getListeneeSet().size() == 1);
assert (Util.getObjectName((Util.asAMX(proxy.getListeneeSet().iterator().next()))).equals(objectName));
//trace( "testListen: NEWING" );
final MyListener myListener = new MyListener(2); // we expect two changes, see below
proxy.addNotificationListener(myListener, null, null);
final String saveLevel = queryMgr.getMBeanLogLevel();
queryMgr.setMBeanLogLevel("" + Level.FINEST);
queryMgr.setMBeanLogLevel(saveLevel);
//trace( "testListen: WAITING" );
// delivery may be asynchronous; wait until done
if ( ! myListener.await( 5, TimeUnit.SECONDS ) )
{
//trace( "testListen: FAILED TIMEOUT" );
assert false : "NotificationServiceTest.testListen(): TIMED OUT waiting for Notifications";
}
//trace( "testListen: NOT FAILED" );
assert (myListener.getCount() == 2);
Notification[] notifs = helper.getNotifications();
assertEquals(2, notifs.length);
assert (notifs[0].getType().equals(AttributeChangeNotification.ATTRIBUTE_CHANGE));
assert (notifs[1].getType().equals(AttributeChangeNotification.ATTRIBUTE_CHANGE));
notifs = helper.getNotifications();
assert (notifs.length == 0);
proxy.dontListenTo(objectName);
assert (proxy.getListeneeSet().size() == 0);
removeNotificationService(proxy);
//trace( "testListen: EXIT" );
}
}