package org.jolokia.server.core.util.jmx;

import java.lang.management.ManagementFactory;

import javax.management.*;

import org.testng.annotations.Test;

import static org.testng.Assert.assertEquals;

/**
 * @author roland
 * @since 07.03.13
 */
public class JmxUtilTest implements NotificationListener {


    private int counter = 0;

    @Test
    public void newObjectName() throws MalformedObjectNameException {
        ObjectName name = JmxUtil.newObjectName("java.lang:type=blub");
        assertEquals(name, new ObjectName("java.lang:type=blub"));
    }

    @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*Invalid.*sogehtsnicht.*")
    public void invalidObjectName() {
        JmxUtil.newObjectName("bla:blub:name=sogehtsnicht");
    }

    @Test
    public void addNotificationListenerTest() throws NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InstanceNotFoundException {
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        counter = 0;
        JmxUtil.addMBeanRegistrationListener(server,this,null);
        ObjectName name = JmxUtil.newObjectName("test:name=demo1");
        server.registerMBean(new Bla(),name);
        assertEquals(counter, 1);
        server.unregisterMBean(name);
        assertEquals(counter, 2);
        JmxUtil.removeMBeanRegistrationListener(server,this);
        server.registerMBean(new Bla(),name);
        assertEquals(counter, 2);
        server.unregisterMBean(name);
        assertEquals(counter, 2);
        counter = 0;
    }

    @Test
    public void addNotificationListenerTestWithFilter() throws MBeanRegistrationException, InstanceNotFoundException, InstanceAlreadyExistsException, NotCompliantMBeanException {
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        ObjectName name1 = JmxUtil.newObjectName("test:name=demo2");
        ObjectName nameFilter = JmxUtil.newObjectName("test:name=registered");

        JmxUtil.addMBeanRegistrationListener(server,this,nameFilter);

        counter = 0;

        server.registerMBean(new Bla(),name1);
        assertEquals(counter, 0);
        server.unregisterMBean(name1);
        assertEquals(counter, 0);
        server.registerMBean(new Bla(),nameFilter);
        assertEquals(counter, 1);
        server.unregisterMBean(nameFilter);
        assertEquals(counter, 2);

        JmxUtil.removeMBeanRegistrationListener(server,this);

        server.registerMBean(new Bla(),nameFilter);
        assertEquals(counter, 2);
        server.unregisterMBean(nameFilter);
        assertEquals(counter, 2);

        counter = 0;
    }

    @Test
    public void unknowListenerDeregistrationShouldBeSilentlyIgnored() {
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        JmxUtil.removeMBeanRegistrationListener(server,this);

    }

    public void handleNotification(Notification notification, Object handback) {
        System.out.println("got notification: " + notification);
        counter++;
    }

    public static class Bla implements BlaMBean {}
    public interface BlaMBean {}
}
